summaryrefslogtreecommitdiff
path: root/boost/pending/detail/property.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/pending/detail/property.hpp')
-rw-r--r--boost/pending/detail/property.hpp139
1 files changed, 0 insertions, 139 deletions
diff --git a/boost/pending/detail/property.hpp b/boost/pending/detail/property.hpp
index 09e8866cf6..42c7ce07dc 100644
--- a/boost/pending/detail/property.hpp
+++ b/boost/pending/detail/property.hpp
@@ -13,147 +13,8 @@ namespace boost {
namespace detail {
- template <class PropertyTag1, class PropertyTag2>
- struct same_property {
- enum { value = is_same<PropertyTag1,PropertyTag2>::value };
- };
-
struct error_property_not_found { };
- template <int TagMatched>
- struct property_value_dispatch {
- template <class PropertyTag, class T, class Tag>
- inline static T& get_value(PropertyTag& p, T*, Tag) {
- return p.m_value;
- }
- template <class PropertyTag, class T, class Tag>
- inline static const T& const_get_value(const PropertyTag& p, T*, Tag) {
- return p.m_value;
- }
- };
-
- template <class PropertyList>
- struct property_value_end {
- template <class T> struct result { typedef T type; };
-
- template <class T, class Tag>
- inline static T& get_value(PropertyList& p, T* t, Tag tag) {
- typedef typename PropertyList::next_type Next;
- typedef typename Next::tag_type Next_tag;
- enum { match = same_property<Next_tag,Tag>::value };
- return property_value_dispatch<match>
- ::get_value(static_cast<Next&>(p), t, tag);
- }
- template <class T, class Tag>
- inline static const T& const_get_value(const PropertyList& p, T* t, Tag tag) {
- typedef typename PropertyList::next_type Next;
- typedef typename Next::tag_type Next_tag;
- enum { match = same_property<Next_tag,Tag>::value };
- return property_value_dispatch<match>
- ::const_get_value(static_cast<const Next&>(p), t, tag);
- }
- };
- template <>
- struct property_value_end<no_property> {
- template <class T> struct result {
- typedef detail::error_property_not_found type;
- };
-
- // Stop the recursion and return error
- template <class T, class Tag>
- inline static detail::error_property_not_found&
- get_value(no_property&, T*, Tag) {
- static error_property_not_found s_prop_not_found;
- return s_prop_not_found;
- }
- template <class T, class Tag>
- inline static const detail::error_property_not_found&
- const_get_value(const no_property&, T*, Tag) {
- static error_property_not_found s_prop_not_found;
- return s_prop_not_found;
- }
- };
-
- template <>
- struct property_value_dispatch<0> {
- template <class PropertyList, class T, class Tag>
- inline static typename property_value_end<PropertyList>::template result<T>::type&
- get_value(PropertyList& p, T* t, Tag tag) {
- return property_value_end<PropertyList>::get_value(p, t, tag);
- }
- template <class PropertyList, class T, class Tag>
- inline static const typename property_value_end<PropertyList>::template result<T>::type&
- const_get_value(const PropertyList& p, T* t, Tag tag) {
- return property_value_end<PropertyList>::const_get_value(p, t, tag);
- }
- };
-
- template <class PropertyList>
- struct build_property_tag_value_alist
- {
- typedef typename PropertyList::next_type NextProperty;
- typedef typename PropertyList::value_type Value;
- typedef typename PropertyList::tag_type Tag;
- typedef typename build_property_tag_value_alist<NextProperty>::type Next;
- typedef std::pair< std::pair<Tag,Value>, Next> type;
- };
- template <>
- struct build_property_tag_value_alist<no_property>
- {
- typedef no_property type;
- };
-
-#if !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
- template <class TagValueAList, class Tag>
- struct extract_value {
- typedef error_property_not_found type;
- };
- template <class Value, class Tag1, class Tag2, class Rest>
- struct extract_value< std::pair<std::pair<Tag1,Value>,Rest>, Tag2> {
- typedef typename extract_value<Rest,Tag2>::type type;
- };
- template <class Value, class Tag, class Rest>
- struct extract_value< std::pair<std::pair<Tag,Value>,Rest>, Tag> {
- typedef Value type;
- };
-#else
- // VC++ workaround:
- // The main idea here is to replace partial specialization with
- // nested template member classes. Of course there is the
- // further complication that the outer class of the nested
- // template class cannot itself be a template class.
- // Hence the need for the ev_selector. -JGS
-
- struct recursive_extract;
- struct end_extract;
-
- template <class TagValueAList>
- struct ev_selector { typedef recursive_extract type; };
- template <>
- struct ev_selector<no_property> { typedef end_extract type; };
-
- struct recursive_extract {
- template <class TagValueAList, class Tag1>
- struct bind_ {
- typedef typename TagValueAList::first_type AListFirst;
- typedef typename AListFirst::first_type Tag2;
- typedef typename AListFirst::second_type Value;
- enum { match = same_property<Tag1,Tag2>::value };
- typedef typename TagValueAList::second_type Next;
- typedef typename ev_selector<Next>::type Extractor;
- typedef typename boost::ct_if< match, Value,
- typename Extractor::template bind_<Next,Tag1>::type
- >::type type;
- };
- };
- struct end_extract {
- template <class AList, class Tag1>
- struct bind_ {
- typedef error_property_not_found type;
- };
- };
-#endif //!defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
-
} // namespace detail
} // namespace boost