00001 #ifndef _IT_REFLECT_NILLABLE_VALUE_IMPL_T_H_
00002 #define _IT_REFLECT_NILLABLE_VALUE_IMPL_T_H_
00003
00004
00005
00006
00007 #include <it_bus/reflect/nillable.h>
00008 #include <it_bus/reflect/reflection_impl_t.h>
00009
00010 namespace IT_Reflect
00011 {
00015 template <class NillableT, class T>
00016 class NillableValueImplT :
00017 public virtual ReflectionImplT<NillableT>,
00018 public virtual Nillable
00019 {
00020 public:
00024 NillableValueImplT(
00025 const NillableT* data
00026 ) IT_THROW_DECL(());
00027
00031 virtual ~NillableValueImplT() IT_THROW_DECL(());
00032
00033 virtual IT_Bus::Boolean
00034 get_is_nil() const IT_THROW_DECL(());
00035
00036 virtual void
00037 set_is_nil() IT_THROW_DECL(());
00038
00039 virtual const Reflection*
00040 get_value() const IT_THROW_DECL((ReflectException));
00041
00042 virtual Reflection*
00043 use_value() IT_THROW_DECL((ReflectException));
00044
00045 private:
00046
00047 NillableValueImplT(const NillableValueImplT&);
00048 void operator=(const NillableValueImplT&);
00049 };
00050
00051 template <class NillableT, class T>
00052 NillableValueImplT<NillableT, T>::NillableValueImplT(
00053 const NillableT* data
00054 ) IT_THROW_DECL(())
00055 :
00056 ReflectionImplT<NillableT>(data)
00057 {
00058
00059 }
00060
00061 template <class NillableT, class T>
00062 NillableValueImplT<NillableT, T>::~NillableValueImplT(
00063 ) IT_THROW_DECL(())
00064 {
00065
00066 }
00067
00068 template <class NillableT, class T>
00069 IT_Bus::Boolean
00070 NillableValueImplT<NillableT, T>::get_is_nil(
00071 ) const IT_THROW_DECL(())
00072 {
00073 return this->m_data->is_nil();
00074 }
00075
00076 template <class NillableT, class T>
00077 void
00078 NillableValueImplT<NillableT, T>::set_is_nil(
00079 ) IT_THROW_DECL(())
00080 {
00081 this->m_data->set_nil();
00082 }
00083
00084 template <class NillableT, class T>
00085 const Reflection*
00086 NillableValueImplT<NillableT, T>::get_value(
00087 ) const IT_THROW_DECL((ReflectException))
00088 {
00089 return get_is_nil() ?
00090 0 : Traits<T>::get_reflection(this->m_data->get());
00091 }
00092
00093 template <class NillableT, class T>
00094 Reflection*
00095 NillableValueImplT<NillableT, T>::use_value(
00096 ) IT_THROW_DECL((ReflectException))
00097 {
00098 this->m_data->m_is_nil = false;
00099 return Traits<T>::get_reflection(this->m_data->get());
00100 }
00101 }
00102
00103
00104 #endif