Go to the documentation of this file.00001 #ifndef OPENTISSUE_UTILITY_UTILITY_TAG_TRAITS_H
00002 #define OPENTISSUE_UTILITY_UTILITY_TAG_TRAITS_H
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include <boost/utility.hpp>
00012
00013 namespace OpenTissue
00014 {
00015 namespace utility
00016 {
00017
00052 template <typename T>
00053 struct TagSupportedType
00054 {
00055 typedef void has_tag;
00056 typedef T tag_type;
00057 tag_type m_tag;
00058 };
00059 typedef TagSupportedType<int> default_tag_supported_type;
00060
00061 template <class T, class Enable = void>
00062 struct tag_traits { static bool const has_tag = false; typedef int tag_type; };
00063
00064 template <class T>
00065 struct tag_traits<T, typename T::has_tag > { static bool const has_tag = true; typedef typename T::tag_type tag_type; };
00066
00067 template <class T>
00068 inline bool has_tag(T const & obj, typename boost::disable_if_c< tag_traits<T>::has_tag >::type * dummy = 0)
00069 { return false; }
00070 template <class T>
00071 inline bool has_tag(T const & obj, typename boost::enable_if_c< tag_traits<T>::has_tag >::type * dummy = 0)
00072 { return true; }
00073
00074 template <typename T>
00075 inline typename tag_traits<T>::tag_type tag_value(T const & obj, typename boost::disable_if_c< tag_traits<T>::has_tag >::type * dummy = 0)
00076 { return 0; }
00077 template <typename T>
00078 inline typename tag_traits<T>::tag_type tag_value(T const & obj, typename boost::enable_if_c< tag_traits<T>::has_tag >::type * dummy = 0)
00079 { return obj.m_tag; }
00080
00081 template <class T>
00082 inline void set_tag(T & , typename tag_traits<T>::tag_type const & , typename boost::disable_if_c< tag_traits<T>::has_tag >::type * dummy = 0)
00083 { }
00084 template <class T>
00085 inline void set_tag(T & obj, typename tag_traits<T>::tag_type const & tag, typename boost::enable_if_c< tag_traits<T>::has_tag >::type * dummy = 0)
00086 { obj.m_tag = tag; }
00087
00088 }
00089
00090 }
00091
00092
00093 #endif