| ////////////////////////////////////////////////////////////////////////////// |
| // (C) Copyright John Maddock 2000. |
| // (C) Copyright Ion Gaztanaga 2005-2012. |
| // |
| // 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/interprocess for documentation. |
| // |
| ////////////////////////////////////////////////////////////////////////////// |
| |
| #ifndef BOOST_INTERPROCESS_DETAIL_TYPE_TRAITS_HPP |
| #define BOOST_INTERPROCESS_DETAIL_TYPE_TRAITS_HPP |
| |
| #ifndef BOOST_CONFIG_HPP |
| # include <boost/config.hpp> |
| #endif |
| # |
| #if defined(BOOST_HAS_PRAGMA_ONCE) |
| # pragma once |
| #endif |
| |
| #include <boost/interprocess/detail/config_begin.hpp> |
| |
| namespace boost { |
| namespace interprocess { |
| namespace ipcdetail { |
| |
| struct nat{}; |
| |
| template<class T> |
| struct remove_reference |
| { |
| typedef T type; |
| }; |
| |
| template<class T> |
| struct remove_reference<T&> |
| { |
| typedef T type; |
| }; |
| |
| template<class T> |
| struct is_reference |
| { |
| static const bool value = false; |
| }; |
| |
| template<class T> |
| struct is_reference<T&> |
| { |
| static const bool value = true; |
| }; |
| |
| template<class T> |
| struct is_pointer |
| { |
| static const bool value = false; |
| }; |
| |
| template<class T> |
| struct is_pointer<T*> |
| { |
| static const bool value = true; |
| }; |
| |
| template <typename T> |
| struct add_reference |
| { |
| typedef T& type; |
| }; |
| |
| template<class T> |
| struct add_reference<T&> |
| { |
| typedef T& type; |
| }; |
| |
| template<> |
| struct add_reference<void> |
| { |
| typedef nat &type; |
| }; |
| |
| template<> |
| struct add_reference<const void> |
| { |
| typedef const nat &type; |
| }; |
| |
| template <class T> |
| struct add_const_reference |
| { typedef const T &type; }; |
| |
| template <class T> |
| struct add_const_reference<T&> |
| { typedef T& type; }; |
| |
| template<class T> |
| struct remove_const |
| { |
| typedef T type; |
| }; |
| |
| template<class T> |
| struct remove_const<const T> |
| { |
| typedef T type; |
| }; |
| |
| template<class T> |
| struct remove_volatile |
| { |
| typedef T type; |
| }; |
| |
| template<class T> |
| struct remove_volatile<volatile T> |
| { |
| typedef T type; |
| }; |
| |
| template<class T> |
| struct remove_const_volatile |
| { |
| typedef typename remove_const<typename remove_volatile<T>::type>::type type; |
| }; |
| |
| template <typename T, typename U> |
| struct is_same |
| { |
| typedef char yes_type; |
| struct no_type |
| { |
| char padding[8]; |
| }; |
| |
| template <typename V> |
| static yes_type is_same_tester(V*, V*); |
| static no_type is_same_tester(...); |
| |
| static T *t; |
| static U *u; |
| |
| static const bool value = sizeof(yes_type) == sizeof(is_same_tester(t,u)); |
| }; |
| |
| template<class T, class U> |
| struct is_cv_same |
| { |
| static const bool value = is_same< typename remove_const_volatile<T>::type |
| , typename remove_const_volatile<U>::type >::value; |
| }; |
| |
| } // namespace ipcdetail |
| } //namespace interprocess { |
| } //namespace boost { |
| |
| #include <boost/interprocess/detail/config_end.hpp> |
| |
| #endif //#ifndef BOOST_INTERPROCESS_DETAIL_TYPE_TRAITS_HPP |