00001 #ifndef _IT_REFLECT_ELEMENT_LIST_IMPL_T_H_
00002 #define _IT_REFLECT_ELEMENT_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 {
00017 template <class ListT, class T>
00018 class ElementListImplT :
00019 public virtual ReflectionImpl,
00020 public virtual ElementListImplBase
00021 {
00022 public:
00026 ElementListImplT(
00027 const ListT* data
00028 ) throw(());
00029
00034 virtual IT_Bus::AnyType*
00035 clone() const throw((ReflectException));
00036
00037 protected:
00042 virtual IT_Bus::MinMaxList&
00043 get_list() const throw(());
00044
00050 virtual Reflection*
00051 get_reflection(
00052 size_t index
00053 ) const throw((ReflectException));
00054
00059 virtual IT_Bus::AnyType&
00060 get_data() const throw(());
00061
00062 private:
00063 ListT* m_data;
00064 };
00065
00066 template <class ListT, class T>
00067 ElementListImplT<ListT, T>::ElementListImplT(
00068 const ListT* data
00069 ) throw(())
00070 :
00071 m_data(IT_CONST_CAST(ListT*, data))
00072 {
00073
00074 }
00075
00076 template <class ListT, class T>
00077 IT_Bus::MinMaxList&
00078 ElementListImplT<ListT, T>::get_list(
00079 ) const throw(())
00080 {
00081 return *m_data;
00082 }
00083
00084 template <class ListT, class T>
00085 Reflection*
00086 ElementListImplT<ListT, T>::get_reflection(
00087 size_t index
00088 ) const throw((ReflectException))
00089 {
00090 return Traits<T>::get_reflection((*m_data)[index]);
00091 }
00092
00093 template <class ListT, class T>
00094 IT_Bus::AnyType&
00095 ElementListImplT<ListT, T>::get_data() const throw(())
00096 {
00097 return *m_data;
00098 }
00099
00100 template <class ListT, class T>
00101 IT_Bus::AnyType*
00102 ElementListImplT<ListT, T>::clone(
00103 ) const throw((ReflectException))
00104 {
00105 return new ListT(*m_data);
00106 }
00107
00108 }
00109
00110 #endif