epoc32/include/stdapis/boost/pending/detail/property.hpp
branchSymbian2
changeset 3 e1b950c65cb4
parent 2 2fe1408b6811
child 4 837f303aceeb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/epoc32/include/stdapis/boost/pending/detail/property.hpp	Wed Mar 31 12:27:01 2010 +0100
@@ -0,0 +1,132 @@
+//  (C) Copyright Jeremy Siek 2004 
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_PROPERTY_HPP
+#define BOOST_PROPERTY_HPP
+
+#include <boost/pending/ct_if.hpp>
+
+namespace boost {
+
+  struct no_property { 
+    typedef no_property tag_type;
+    typedef no_property next_type;
+    typedef no_property value_type;
+    enum { num = 0 };
+    typedef void kind;
+  };
+
+  template <class Tag, class T, class Base = no_property>
+  struct property : public Base {
+    typedef Base next_type;
+    typedef Tag tag_type;
+    typedef T value_type;
+#if BOOST_WORKAROUND (__GNUC__, < 3)
+    property() { }
+#else
+    property() : m_value() { }
+#endif
+    property(const T& v) : m_value(v) { }
+    property(const T& v, const Base& b) : Base(b), m_value(v) { }
+    // copy constructor and assignment operator will be generated by compiler
+
+    T m_value;
+  };
+
+  // The BGL properties specialize property_kind and
+  // property_num, and use enum's for the Property type (see
+  // graph/properties.hpp), but the user may want to use a class
+  // instead with a nested kind type and num.  Also, we may want to
+  // switch BGL back to using class types for properties at some point.
+
+  template <class PropertyTag>
+  struct property_kind {
+    typedef typename PropertyTag::kind type;
+  };
+
+  template <class P>
+  struct has_property { 
+    BOOST_STATIC_CONSTANT(bool, value = true);
+    typedef true_type type;
+  };
+  template <>
+  struct has_property<no_property> { 
+    BOOST_STATIC_CONSTANT(bool, value = false); 
+    typedef false_type type; 
+  };
+
+} // namespace boost
+
+#include <boost/pending/detail/property.hpp>
+
+namespace boost {
+
+  template <class PropertyList, class Tag>
+  struct property_value {
+#if !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+    typedef typename detail::build_property_tag_value_alist<PropertyList>::type AList;
+    typedef typename detail::extract_value<AList,Tag>::type type;
+#else
+    typedef typename detail::build_property_tag_value_alist<PropertyList>::type AList;
+    typedef typename detail::ev_selector<AList>::type Extractor;
+    typedef typename Extractor::template bind_<AList,Tag>::type type;
+#endif  
+  };
+
+  template <class Tag1, class Tag2, class T1, class Base>
+  inline typename property_value<property<Tag1,T1,Base>, Tag2>::type& 
+  get_property_value(property<Tag1,T1,Base>& p, Tag2 tag2) {
+    BOOST_STATIC_CONSTANT(bool, 
+                          match = (detail::same_property<Tag1,Tag2>::value));
+    typedef property<Tag1,T1,Base> Prop;
+    typedef typename property_value<Prop, Tag2>::type T2;
+    T2* t2 = 0;
+    typedef detail::property_value_dispatch<match> Dispatcher;
+    return Dispatcher::get_value(p, t2, tag2);
+  }
+  template <class Tag1, class Tag2, class T1, class Base>
+  inline
+  const typename property_value<property<Tag1,T1,Base>, Tag2>::type& 
+  get_property_value(const property<Tag1,T1,Base>& p, Tag2 tag2) {
+    BOOST_STATIC_CONSTANT(bool, 
+                          match = (detail::same_property<Tag1,Tag2>::value));
+    typedef property<Tag1,T1,Base> Prop;
+    typedef typename property_value<Prop, Tag2>::type T2;
+    T2* t2 = 0;
+    typedef detail::property_value_dispatch<match> Dispatcher;
+    return Dispatcher::const_get_value(p, t2, tag2);
+  }
+
+ namespace detail {
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+   template<typename FinalTag, typename FinalType>
+   struct retag_property_list
+   {
+     typedef property<FinalTag, FinalType> type;
+     typedef FinalType retagged;
+   };
+
+   template<typename FinalTag, typename Tag, typename T, typename Base>
+   struct retag_property_list<FinalTag, property<Tag, T, Base> >
+   {
+   private:
+     typedef retag_property_list<FinalTag, Base> next;
+
+   public:
+     typedef property<Tag, T, typename next::type> type;
+     typedef typename next::retagged retagged;
+   };
+
+   template<typename FinalTag>
+   struct retag_property_list<FinalTag, no_property>
+   {
+     typedef no_property type;
+     typedef no_property retagged;
+   };
+#endif
+  }
+} // namesapce boost
+
+#endif /* BOOST_PROPERTY_HPP */