00001 #ifndef _IT_REFLECT_TYPE_LIST_IMPL_T_H_
00002 #define _IT_REFLECT_TYPE_LIST_IMPL_T_H_
00003
00004
00005
00006
00007 #include <it_bus/reflect/reflection_impl.h>
00008 #include <it_bus/reflect/element_list_impl_base.h>
00009 #include <it_bus/reflect/bounds_exception.h>
00010 #include <it_bus/reflect/traits.h>
00011
00012 namespace IT_Reflect
00013 {
00015 template <class ListT, class T>
00016 class TypeListImplT :
00017 public virtual ReflectionImpl,
00018 public virtual ElementListImplBase
00019 {
00020 public:
00024 TypeListImplT(
00025 const ListT* data
00026 ) throw(());
00027
00028 virtual IT_Bus::AnyType*
00029 clone() const throw((ReflectException));
00030
00031 protected:
00032 virtual IT_Bus::MinMaxList&
00033 get_list() const throw(());
00034
00035 virtual Reflection*
00036 get_reflection(
00037 size_t index
00038 ) const throw((ReflectException));
00039
00040 virtual IT_Bus::AnyType&
00041 get_data() const throw(());
00042
00043 private:
00044 ListT* m_data;
00045 };
00046
00047 template <class ListT, class T>
00048 TypeListImplT<ListT, T>::TypeListImplT(
00049 const ListT* data
00050 ) throw(())
00051 :
00052 m_data(IT_CONST_CAST(ListT*, data))
00053 {
00054
00055 }
00056
00057 template <class ListT, class T>
00058 IT_Bus::MinMaxList&
00059 TypeListImplT<ListT, T>::get_list(
00060 ) const throw(())
00061 {
00062 return *m_data;
00063 }
00064
00065 template <class ListT, class T>
00066 Reflection*
00067 TypeListImplT<ListT, T>::get_reflection(
00068 size_t index
00069 ) const throw((ReflectException))
00070 {
00071 return Traits<T>::get_reflection((*m_data)[index]);
00072 }
00073
00074 template <class ListT, class T>
00075 IT_Bus::AnyType&
00076 TypeListImplT<ListT, T>::get_data() const throw(())
00077 {
00078 return *m_data;
00079 }
00080
00081 template <class ListT, class T>
00082 IT_Bus::AnyType*
00083 TypeListImplT<ListT, T>::clone(
00084 ) const throw((ReflectException))
00085 {
00086 return new ListT(*m_data);
00087 }
00088
00089 }
00090
00091 #endif