TypeOpsEx.cpp

// TypeOpsEx.cpp
//
// Author David Barrett-Lennard
// (C)opyright Cedanet Pty Ltd 2012

@import "CedaExamples/lxPersistStore/BinaryNode.h"
@import "Ceda/cxPersistStore/IPersistStore.h"
@import "Ceda/cxPersistStore/pref.h"
@import "Ceda/cxPersistStore/IPrefVisitor.h"
@import "Ceda/cxObject/IObjectVisitor.h"
@import "Ceda/cxObject/ReflectionByteCodeTypes.h"
@import "Ceda/cxObject/ReflectionByteCodeValue.h"
@import "Ceda/cxObject/OpenVariant.h"
#include "Ceda/cxUtils/TracerUtils.h"

namespace ceda
{
    // Hmmm: unless this appears in namespace ceda it doesn't work!  Why?
    $type+ int32[3];
}

namespace TypeOpsEx
{
    $model+ X
    {
    };
    
    $enum+ E
    {
    };
    
    $adt+ A
    {
    };

    $adt+ implement A
    {
    }   ;

    $type+ ceda::xvector<X>;
    $type+ ceda::xvector<E>;
    
    void Run()
    {
        ceda::TraceGroup g("TypeOps example");
        
        @for (T in 
            [
                void,
                ceda::int8,
                ceda::int16,
                ceda::int32,
                ceda::int64,
                ceda::uint8,
                ceda::uint16,
                ceda::uint32,
                ceda::uint64,
                ceda::float32,
                ceda::float64,
                ceda::char8,
                ceda::char16,
                ceda::string8,
                ceda::string16,
                const void,
                const ceda::int8,
                const ceda::int16,
                const ceda::int32,
                const ceda::int64,
                const ceda::uint8,
                const ceda::uint16,
                const ceda::uint32,
                const ceda::uint64,
                const ceda::float32,
                const ceda::float64,
                const ceda::char8,
                const ceda::char16,
                const ceda::string8,
                const ceda::string16,
                ceda::ptr<ceda::IObject>,
                ceda::ptr<const ceda::IObject>,
                ceda::openvariant<ceda::IObject>,
                ceda::openvariant<const ceda::IObject>,
                ceda::pref<ceda::IObject>,
                ceda::pref<const ceda::IObject>,
                ceda::cref<BinaryNode>,
                ceda::cref<const BinaryNode>,
                ceda::IObject,
                BinaryNode,
                X,
                E,
                A,
                ceda::int32[3],
                ceda::xvector<X>,
                ceda::xvector<E>
            ])
        {
            Tracer() << @str(T : ) << ceda::GetReflectionByteCode< T >() << " typeops = " << ceda::FindTypeOps(ceda::GetReflectionByteCode< T >()) << '\n';

        }

        // todo : support openvariant<>.  Why does ptr<> work?
        @for (T in 
            [
                ceda::int8,
                ceda::int16,
                ceda::int32,
                ceda::int64,
                ceda::uint8,
                ceda::uint16,
                ceda::uint32,
                ceda::uint64,
                ceda::float32,
                ceda::float64,
                ceda::char8,
                ceda::char16,
                ceda::string8,
                ceda::string16,
                ceda::ptr<ceda::IObject>,
                ceda::ptr<const ceda::IObject>,
                ceda::pref<ceda::IObject>,
                ceda::pref<const ceda::IObject>,
                ceda::cref<BinaryNode>,
                ceda::cref<const BinaryNode>,
                BinaryNode,
                X,
                E,
                A,
                ceda::int32[3],
                ceda::xvector<X>,
                ceda::xvector<E>
            ])
        {
            ceda::GetTypeOps<T>();
            cxVerify(ceda::FindTypeOps(ceda::GetReflectionByteCode< T >()));
            
        }

        const ceda::TypeOps& t1 = ceda::GetTypeOps< ceda::pref<ceda::IObject> >();
        ceda::ReflectionByteCode r1 = ceda::GetReflectionByteCode< ceda::pref<ceda::IObject> >();

        const ceda::TypeOps& t2 = ceda::GetTypeOps< ceda::int32[3] >();
    }
}