| ////////////////////////////////////////////////////////////////////////////// |
| // |
| // (C) Copyright Ion Gaztanaga 2005-2009. 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) |
| // |
| // See http://www.boost.org/libs/container for documentation. |
| // |
| ////////////////////////////////////////////////////////////////////////////// |
| // |
| // This code comes from N1953 document by Howard E. Hinnant |
| // |
| ////////////////////////////////////////////////////////////////////////////// |
| |
| |
| #ifndef BOOST_CONTAINERS_DETAIL_VERSION_TYPE_HPP |
| #define BOOST_CONTAINERS_DETAIL_VERSION_TYPE_HPP |
| |
| #include "config_begin.hpp" |
| |
| #include INCLUDE_BOOST_CONTAINER_DETAIL_MPL_HPP |
| #include INCLUDE_BOOST_CONTAINER_DETAIL_TYPE_TRAITS_HPP |
| |
| |
| namespace boost{ |
| namespace container { |
| namespace containers_detail { |
| |
| //using namespace boost; |
| |
| template <class T, unsigned V> |
| struct version_type |
| : public containers_detail::integral_constant<unsigned, V> |
| { |
| typedef T type; |
| |
| version_type(const version_type<T, 0>&); |
| }; |
| |
| namespace impl{ |
| |
| template <class T, |
| bool = containers_detail::is_convertible<version_type<T, 0>, typename T::version>::value> |
| struct extract_version |
| { |
| static const unsigned value = 1; |
| }; |
| |
| template <class T> |
| struct extract_version<T, true> |
| { |
| static const unsigned value = T::version::value; |
| }; |
| |
| template <class T> |
| struct has_version |
| { |
| private: |
| struct two {char _[2];}; |
| template <class U> static two test(...); |
| template <class U> static char test(const typename U::version*); |
| public: |
| static const bool value = sizeof(test<T>(0)) == 1; |
| void dummy(){} |
| }; |
| |
| template <class T, bool = has_version<T>::value> |
| struct version |
| { |
| static const unsigned value = 1; |
| }; |
| |
| template <class T> |
| struct version<T, true> |
| { |
| static const unsigned value = extract_version<T>::value; |
| }; |
| |
| } //namespace impl |
| |
| template <class T> |
| struct version |
| : public containers_detail::integral_constant<unsigned, impl::version<T>::value> |
| { |
| }; |
| |
| } //namespace containers_detail { |
| } //namespace container { |
| } //namespace boost{ |
| |
| #endif //#define BOOST_CONTAINERS_DETAIL_VERSION_TYPE_HPP |