111 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			111 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | ////////////////////////////////////////////////////////////////////////////// | ||
|  | // | ||
|  | // (C) Copyright Ion Gaztanaga 2005-2013. 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_CONTAINER_DETAIL_VERSION_TYPE_HPP | ||
|  | #define BOOST_CONTAINER_DETAIL_VERSION_TYPE_HPP | ||
|  | 
 | ||
|  | #ifndef BOOST_CONFIG_HPP | ||
|  | #  include <boost/config.hpp> | ||
|  | #endif | ||
|  | 
 | ||
|  | #if defined(BOOST_HAS_PRAGMA_ONCE) | ||
|  | #  pragma once | ||
|  | #endif | ||
|  | 
 | ||
|  | #include <boost/container/detail/config_begin.hpp> | ||
|  | #include <boost/container/detail/workaround.hpp> | ||
|  | 
 | ||
|  | #include <boost/container/detail/mpl.hpp> | ||
|  | #include <boost/container/detail/type_traits.hpp> | ||
|  | 
 | ||
|  | namespace boost{ | ||
|  | namespace container { | ||
|  | namespace container_detail { | ||
|  | 
 | ||
|  | template <class T, unsigned V> | ||
|  | struct version_type | ||
|  |     : public container_detail::integral_constant<unsigned, V> | ||
|  | { | ||
|  |     typedef T type; | ||
|  | 
 | ||
|  |     version_type(const version_type<T, 0>&); | ||
|  | }; | ||
|  | 
 | ||
|  | namespace impl{ | ||
|  | 
 | ||
|  | template <class T, | ||
|  |           bool = container_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 container_detail::integral_constant<unsigned, impl::version<T>::value> | ||
|  | {}; | ||
|  | 
 | ||
|  | template<class T, unsigned N> | ||
|  | struct is_version | ||
|  | { | ||
|  |    static const bool value = | ||
|  |       is_same< typename version<T>::type, integral_constant<unsigned, N> >::value; | ||
|  | }; | ||
|  | 
 | ||
|  | }  //namespace container_detail { | ||
|  | 
 | ||
|  | typedef container_detail::integral_constant<unsigned, 0> version_0; | ||
|  | typedef container_detail::integral_constant<unsigned, 1> version_1; | ||
|  | typedef container_detail::integral_constant<unsigned, 2> version_2; | ||
|  | 
 | ||
|  | }  //namespace container { | ||
|  | }  //namespace boost{ | ||
|  | 
 | ||
|  | #include <boost/container/detail/config_end.hpp> | ||
|  | 
 | ||
|  | #endif   //#define BOOST_CONTAINER_DETAIL_VERSION_TYPE_HPP |