|
7 | 7 | #include <string>
|
8 | 8 | #include <vector>
|
9 | 9 | #include <unordered_map>
|
10 |
| -#include <iostream> |
11 | 10 |
|
12 | 11 | namespace csp
|
13 | 12 | {
|
@@ -669,69 +668,16 @@ class StructMeta : public std::enable_shared_from_this<StructMeta>
|
669 | 668 | };
|
670 | 669 |
|
671 | 670 | template<typename T>
|
672 |
| -std::shared_ptr<typename StructField::upcast<T>::type> StructMeta::getMetaField(const char* fieldname, const char* expectedtype) { |
673 |
| - std::cout << "\n=== getMetaField Debug ===\n"; |
674 |
| - std::cout << "1. Looking for field: " << fieldname << "\n"; |
675 |
| - |
676 |
| - auto field_ = field(fieldname); |
677 |
| - if(!field_) { |
678 |
| - std::cout << "2. Field not found!\n"; |
679 |
| - CSP_THROW(TypeError, "Struct type " << name() << " missing required field " << fieldname); |
680 |
| - } |
681 |
| - |
682 |
| - std::cout << "2. Field found\n"; |
683 |
| - std::cout << "3. Field name from object: " << field_->fieldname() << "\n"; |
684 |
| - std::cout << "4. Field type from CspType: " << field_->type()->type() << "\n"; |
685 |
| - std::cout << "5. Expected type: " << CspType::Type::fromCType<T>::type << "\n"; |
686 |
| - |
687 |
| - // Memory layout & pointer checks |
688 |
| - const StructField* field_ptr = field_.get(); |
689 |
| - std::cout << "6. Field ptr value: " << field_ptr << "\n"; |
690 |
| - std::cout << "7. Field use count: " << field_.use_count() << "\n"; |
691 |
| - |
692 |
| - // Detailed field information |
693 |
| - if(field_ptr) { |
694 |
| - std::cout << "8. Field metadata:\n"; |
695 |
| - std::cout << " - Field offset: " << field_ptr->offset() << "\n"; |
696 |
| - std::cout << " - Field size: " << field_ptr->size() << "\n"; |
697 |
| - std::cout << " - Field alignment: " << field_ptr->alignment() << "\n"; |
698 |
| - std::cout << " - Field mask offset: " << field_ptr->maskOffset() << "\n"; |
699 |
| - std::cout << " - Field mask bit: " << static_cast<int>(field_ptr->maskBit()) << "\n"; |
700 |
| - |
701 |
| - // Type verification |
702 |
| - std::cout << "9. Type checks:\n"; |
703 |
| - std::cout << " - Original type: " << typeid(field_).name() << "\n"; |
704 |
| - std::cout << " - Target type: " << typeid(typename StructField::upcast<T>::type).name() << "\n"; |
705 |
| - std::cout << " - Is native: " << field_ptr->isNative() << "\n"; |
706 |
| - |
707 |
| - // Test various casts |
708 |
| - std::cout << "10. Detailed cast tests:\n"; |
709 |
| - std::cout << " Base classes:\n"; |
710 |
| - std::cout << " - As StructField*: " << (dynamic_cast<const StructField*>(field_ptr) != nullptr) << "\n"; |
711 |
| - std::cout << " - As NonNativeStructField*: " << (dynamic_cast<const NonNativeStructField*>(field_ptr) != nullptr) << "\n"; |
712 |
| - std::cout << " Non-native implementations:\n"; |
713 |
| - std::cout << " - As StringStructField*: " << (dynamic_cast<const StringStructField*>(field_ptr) != nullptr) << "\n"; |
714 |
| - std::cout << " - As DialectGenericStructField*: " << (dynamic_cast<const DialectGenericStructField*>(field_ptr) != nullptr) << "\n"; |
715 |
| - std::cout << " - As ArrayStructField<std::string>*: " << (dynamic_cast<const ArrayStructField<std::vector<std::string>>*>(field_ptr) != nullptr) << "\n"; |
716 |
| - std::cout << " Native field test:\n"; |
717 |
| - std::cout << " - As NativeStructField<int64_t>*: " << (dynamic_cast<const NativeStructField<int64_t>*>(field_ptr) != nullptr) << "\n"; |
718 |
| -} |
719 |
| - |
720 |
| - using TargetType = typename StructField::upcast<T>::type; |
721 |
| - auto typedfield = std::dynamic_pointer_cast<TargetType>(field_); |
722 |
| - std::cout << "11. Final dynamic_cast result: " << (typedfield ? "success" : "failure") << "\n"; |
| 671 | +std::shared_ptr<typename StructField::upcast<T>::type> StructMeta::getMetaField( const char * fieldname, const char * expectedtype ) |
| 672 | +{ |
| 673 | + auto field_ = field( fieldname ); |
| 674 | + if( !field_ ) |
| 675 | + CSP_THROW( TypeError, "Struct type " << name() << " missing required field " << fieldname << " for " << expectedtype ); |
723 | 676 |
|
724 |
| - if(!typedfield) { |
725 |
| - std::cout << "12. FAILED CAST DETAILS:\n"; |
726 |
| - std::cout << " - Source type: " << typeid(StructField).name() << "\n"; |
727 |
| - std::cout << " - Target type: " << typeid(TargetType).name() << "\n"; |
728 |
| - |
729 |
| - CSP_THROW(TypeError, expectedtype << " - provided struct type " << name() |
730 |
| - << " expected type " << CspType::Type::fromCType<T>::type |
731 |
| - << " for field " << fieldname |
732 |
| - << " but got type " << field_->type()->type() |
733 |
| - << " for " << expectedtype); |
734 |
| - } |
| 677 | + std::shared_ptr<typename StructField::upcast<T>::type> typedfield = std::dynamic_pointer_cast<typename StructField::upcast<T>::type>( field_ ); |
| 678 | + if( !typedfield ) |
| 679 | + CSP_THROW( TypeError, expectedtype << " - provided struct type " << name() << " expected type " << CspType::Type::fromCType<T>::type << " for field " << fieldname |
| 680 | + << " but got type " << field_ -> type() -> type() << " for " << expectedtype ); |
735 | 681 |
|
736 | 682 | return typedfield;
|
737 | 683 | }
|
@@ -827,31 +773,22 @@ class Struct
|
827 | 773 | friend class StructMeta;
|
828 | 774 |
|
829 | 775 | //Note these members are not included on size(), they're stored before "this" ptr ( see operator new / delete )
|
830 |
| - struct alignas(8) HiddenData { |
831 |
| - alignas(8) size_t refcount; // 8 bytes at 0x0 |
832 |
| - alignas(8) std::shared_ptr<const StructMeta> meta; // 16 bytes at 0x8 |
833 |
| - alignas(8) void* dialectPtr; // 8 bytes at 0x18 |
834 |
| - // Total: 32 bytes |
| 776 | + struct HiddenData |
| 777 | + { |
| 778 | + size_t refcount; |
| 779 | + std::shared_ptr<const StructMeta> meta; |
| 780 | + void * dialectPtr; |
835 | 781 | };
|
836 | 782 |
|
837 | 783 | const HiddenData * hidden() const
|
838 | 784 | {
|
839 | 785 | return const_cast<Struct *>( this ) -> hidden();
|
840 | 786 | }
|
841 | 787 |
|
842 |
| - static constexpr size_t HIDDEN_OFFSET = 32; // sizeof(HiddenData) aligned to 8 bytes |
843 |
| - |
844 |
| - HiddenData* hidden() { |
845 |
| - std::byte* base = reinterpret_cast<std::byte*>(this); |
846 |
| - // Force alignment to match shared_ptr requirements |
847 |
| - static_assert(alignof(HiddenData) >= alignof(std::shared_ptr<void>), |
848 |
| - "HiddenData must be aligned for shared_ptr"); |
849 |
| - return reinterpret_cast<HiddenData*>(base - HIDDEN_OFFSET); |
850 |
| - } |
851 |
| - // HiddenData * hidden() |
852 |
| - // { |
853 |
| - // return reinterpret_cast<HiddenData *>( reinterpret_cast<uint8_t *>( this ) - sizeof( HiddenData ) ); |
854 |
| - // } |
| 788 | + HiddenData * hidden() |
| 789 | + { |
| 790 | + return reinterpret_cast<HiddenData *>( reinterpret_cast<uint8_t *>( this ) - sizeof( HiddenData ) ); |
| 791 | + } |
855 | 792 |
|
856 | 793 | //actual data is allocated past this point
|
857 | 794 | };
|
|
0 commit comments