True Axis Physics SDK 1.2.0.1 Beta Documentation
www.trueaxis.com

DescriptorItemList.h

00001 //---------------------------------------------------------------------------------
00002 // File Name: DescriptorItemList.h
00003 // Description: The templated type must inherit from descriptor
00004 //
00005 // Copyright (C) 2004 True Axis Pty Ltd, Australia. 
00006 // All Rights Reserved.
00007 //
00008 // History:
00009 //      Created File.
00010 //---------------------------------------------------------------------------------
00011 
00012 #ifndef TA_DESCRIPTORITEMLIST_H
00013 #define TA_DESCRIPTORITEMLIST_H
00014 
00015 #ifndef TA_DESCRIPTORITEM_H
00016 #include "DescriptorItem.h"
00017 #endif // TA_DESCRIPTORITEM_H
00018 
00019 #ifndef TA_DESCRIPTORLIST_H
00020 #include "DescriptorList.h"
00021 #endif // TA_DESCRIPTORLIST_H
00022 
00023 namespace TA
00024 {
00025 
00026 class TACOMMON_CLASS DescriptorItemList : public DescriptorItem
00027 {
00028 public:
00029     DescriptorItemList() : DescriptorItem() { }
00030     virtual ~DescriptorItemList() { Finalise(); }
00031 
00032     void Initialise(const char* szName, const char* szDescription)
00033     {
00034         DescriptorItem::Initialise(szName, szDescription);
00035     }
00036 
00037     void Finalise()
00038     {
00039         DescriptorItem::Finalise();
00040     }
00041 
00042     static DescriptorItemList& GetFromDescItem(DescriptorItem* pItem)
00043     {
00044         TA_ASSERT(pItem->GetTypeID() == GetStaticTypeID());
00045         return *(DescriptorItemList*)pItem;
00046     }
00047 
00048     // todo: An iterator would be much faster but is a big annoyance to implement here.
00049     virtual int GetListSize(Descriptor* pDescriptor) = 0;
00050     virtual Descriptor& GetListItem(Descriptor* pDescriptor, int nIndex) = 0;
00051     virtual Descriptor* AppendListItem(Descriptor* pDescriptor) = 0;
00052     
00053     virtual String GetValueAsString(Descriptor* pDescriptor) const { return ""; };
00054     virtual String GetDisplayString(Descriptor* pDescriptor) const { return GetName(); };
00055     virtual void SetValueFromString(const char* szString, Descriptor* pDescriptor) {}
00056     virtual void SetToDefaultValue(Descriptor* pDescriptor) {}  
00057     virtual void Read(AmlReader& amlReader, Descriptor* pDescriptor);
00058     virtual u32 GetTypeID() const { return s_nClassID; }
00059     static u32 GetStaticTypeID() { return s_nClassID; }
00060 
00061 private:
00062 
00063     static u32 s_nClassID;
00064 };
00065 
00066 template <class Type>
00067 class DescriptorItemListOfType : public DescriptorItemList
00068 {
00069 public:
00070     enum { INVALID_DATA_OFFSET = 0xFFFFFFFF };
00071 
00072     DescriptorItemListOfType() : DescriptorItemList() 
00073     {
00074         m_nOffset = INVALID_DATA_OFFSET;
00075     }
00076     virtual ~DescriptorItemListOfType() { Finalise(); }
00077 
00078     void Initialise(
00079         const Char* szName,
00080         Descriptor* pDescriptor,
00081         DescriptorList<Type>& list,
00082         const Char* szDescription)
00083     {
00084         DescriptorItemList::Initialise(szName, szDescription);
00085         m_nOffset = (u32)&list - (u32)pDescriptor;
00086     }
00087 
00088     void Finalise()
00089     {
00090         m_nOffset = INVALID_DATA_OFFSET;
00091         DescriptorItemList::Finalise();
00092     }
00093     
00094     virtual int GetListSize(Descriptor* pDescriptor)
00095     {
00096         return GetList(pDescriptor).GetSize();
00097     }
00098 
00099     virtual Descriptor& GetListItem(Descriptor* pDescriptor, int nIndex)
00100     {
00101         return GetList(pDescriptor)[nIndex]; // Slow as.
00102     }
00103 
00104     virtual Descriptor* AppendListItem(Descriptor* pDescriptor)
00105     {
00106         return &GetList(pDescriptor).Append();
00107     }
00108 
00109     // todo : remove
00110 
00111 private:
00112     u32 m_nOffset;
00113 
00114     static u32 s_nClassID;
00115 
00116     DescriptorList<Type>& GetList(Descriptor* pDescriptor) const
00117     {
00118         TA_ASSERT (m_nOffset != INVALID_DATA_OFFSET);
00119         return *(DescriptorList<Type>*)((u32)pDescriptor + m_nOffset);
00120     }
00121 };
00122 
00123 };
00124 
00125 #endif // TA_DESCRIPTORITEMLIST_H


© Copyright 2004-2006 TRUE AXIS PTY LTD Australia. All rights reserved.