mirror of
https://github.com/reactos/reactos.git
synced 2024-09-19 01:00:51 +00:00
151 lines
5.5 KiB
C++
151 lines
5.5 KiB
C++
/*
|
|
*
|
|
* Copyright (c) 2004
|
|
* Francois Dumont
|
|
*
|
|
* This material is provided "as is", with absolutely no warranty expressed
|
|
* or implied. Any use is at your own risk.
|
|
*
|
|
* Permission to use or copy this software for any purpose is hereby granted
|
|
* without fee, provided the above notices are retained on all copies.
|
|
* Permission to modify the code and to distribute modified code is granted,
|
|
* provided the above notices are retained, and a notice that the code was
|
|
* modified is included with the above copyright notice.
|
|
*
|
|
*/
|
|
|
|
#ifndef _STLP_BOOST_TYPE_TRAITS_H
|
|
#define _STLP_BOOST_TYPE_TRAITS_H
|
|
|
|
#ifndef BOOST_CONFIG_SUFFIX_HPP
|
|
# ifdef BOOST_CONFIG_HPP
|
|
# undef BOOST_CONFIG_HPP
|
|
# endif
|
|
# include <boost/config.hpp>
|
|
#endif
|
|
|
|
#include <boost/type_traits/is_integral.hpp>
|
|
#include <boost/type_traits/is_float.hpp>
|
|
#include <boost/type_traits/has_trivial_constructor.hpp>
|
|
#include <boost/type_traits/has_trivial_copy.hpp>
|
|
#include <boost/type_traits/has_trivial_assign.hpp>
|
|
#include <boost/type_traits/has_trivial_destructor.hpp>
|
|
#include <boost/type_traits/is_pod.hpp>
|
|
#include <boost/type_traits/is_pointer.hpp>
|
|
#include <boost/type_traits/is_reference.hpp>
|
|
#include <boost/type_traits/remove_cv.hpp>
|
|
#include <boost/type_traits/is_same.hpp>
|
|
|
|
/*
|
|
* This file mostly wraps boost type_traits in the STLport type_traits.
|
|
* When checking a type traits like trivial assign operator for instance
|
|
* both the boost value and STLport values has to be taken into account
|
|
* as we don't know what the user might have prefer, specializing the boost
|
|
* type traits or the STLport one.
|
|
*/
|
|
_STLP_BEGIN_NAMESPACE
|
|
|
|
template <class _Tp> struct _IsRef {
|
|
enum { _Is = ::boost::is_reference<_Tp>::value };
|
|
typedef typename __bool2type<_Is>::_Ret _Ret;
|
|
};
|
|
|
|
template <class _Tp> struct _IsPtr {
|
|
enum { is_pointer = ::boost::is_pointer<_Tp>::value };
|
|
typedef typename __bool2type<is_pointer>::_Ret _Ret;
|
|
};
|
|
|
|
template <class _Tp> struct _IsIntegral {
|
|
enum { is_integral = ::boost::is_integral<_Tp>::value };
|
|
typedef typename __bool2type<is_integral>::_Ret _Ret;
|
|
};
|
|
|
|
template <class _Tp> struct _IsRational {
|
|
enum { is_float = ::boost::is_float<_Tp>::value };
|
|
typedef typename __bool2type<is_float>::_Ret _Ret;
|
|
};
|
|
|
|
template <class _Tp>
|
|
struct __type_traits {
|
|
enum { trivial_constructor = ::boost::has_trivial_constructor<_Tp>::value };
|
|
typedef typename __bool2type<trivial_constructor>::_Ret has_trivial_default_constructor;
|
|
|
|
enum { trivial_copy = ::boost::has_trivial_copy<_Tp>::value };
|
|
typedef typename __bool2type<trivial_copy>::_Ret has_trivial_copy_constructor;
|
|
|
|
enum { trivial_assign = ::boost::has_trivial_assign<_Tp>::value };
|
|
typedef typename __bool2type<trivial_assign>::_Ret has_trivial_assignment_operator;
|
|
|
|
enum { trivial_destructor = ::boost::has_trivial_destructor<_Tp>::value };
|
|
typedef typename __bool2type<trivial_destructor>::_Ret has_trivial_destructor;
|
|
|
|
enum { pod = ::boost::is_pod<_Tp>::value };
|
|
typedef typename __bool2type<pod>::_Ret is_POD_type;
|
|
};
|
|
|
|
template <class _Tp1, class _Tp2>
|
|
struct _TrivialCopy {
|
|
typedef typename ::boost::remove_cv<_Tp1>::type uncv1;
|
|
typedef typename ::boost::remove_cv<_Tp2>::type uncv2;
|
|
|
|
enum { same = ::boost::is_same<uncv1, uncv2>::value };
|
|
typedef typename __bool2type<same>::_Ret _Same;
|
|
|
|
enum { boost_trivial_assign = ::boost::has_trivial_assign<uncv1>::value };
|
|
typedef typename __bool2type<boost_trivial_assign>::_Ret _BoostTrivialAssign;
|
|
typedef typename __type_traits<uncv1>::has_trivial_assignment_operator _STLPTrivialAssign;
|
|
typedef typename _Lor2<_BoostTrivialAssign, _STLPTrivialAssign>::_Ret _TrivialAssign;
|
|
|
|
typedef typename _Land2<_Same, _TrivialAssign>::_Ret _Type;
|
|
static _Type _Answer() { return _Type(); }
|
|
};
|
|
|
|
template <class _Tp1, class _Tp2>
|
|
struct _TrivialUCopy {
|
|
typedef typename ::boost::remove_cv<_Tp1>::type uncv1;
|
|
typedef typename ::boost::remove_cv<_Tp2>::type uncv2;
|
|
|
|
enum { same = ::boost::is_same<uncv1, uncv2>::value };
|
|
typedef typename __bool2type<same>::_Ret _Same;
|
|
|
|
enum { boost_trivial_copy = ::boost::has_trivial_copy<uncv1>::value };
|
|
typedef typename __bool2type<boost_trivial_copy>::_Ret _BoostTrivialCopy;
|
|
typedef typename __type_traits<uncv1>::has_trivial_copy_constructor _STLPTrivialCopy;
|
|
typedef typename _Lor2<_BoostTrivialCopy, _STLPTrivialCopy>::_Ret _TrivialCopy;
|
|
|
|
typedef typename _Land2<_Same, _TrivialCopy>::_Ret _Type;
|
|
static _Type _Answer() { return _Type(); }
|
|
};
|
|
|
|
template <class _Tp>
|
|
struct _DefaultZeroValue {
|
|
enum { is_integral = ::boost::is_integral<_Tp>::value };
|
|
typedef typename __bool2type<is_integral>::_Ret _IsIntegral;
|
|
enum { is_float = ::boost::is_float<_Tp>::value };
|
|
typedef typename __bool2type<is_float>::_Ret _IsFloat;
|
|
enum { is_pointer = ::boost::is_pointer<_Tp>::value };
|
|
typedef typename __bool2type<is_pointer>::_Ret _IsPointer;
|
|
|
|
typedef typename _Lor3<_IsIntegral, _IsFloat, _IsPointer>::_Ret _Ret;
|
|
};
|
|
|
|
template <class _Tp>
|
|
struct _TrivialInit {
|
|
typedef typename ::boost::remove_cv<_Tp>::type uncv;
|
|
|
|
enum { boost_trivial_constructor = ::boost::has_trivial_constructor<uncv>::value };
|
|
typedef typename __bool2type<boost_trivial_constructor>::_Ret _BoostTrivialInit;
|
|
typedef typename __type_traits<uncv>::has_trivial_default_constructor _STLPTrivialInit;
|
|
typedef typename _Lor2<_BoostTrivialInit, _STLPTrivialInit>::_Ret _Tr1;
|
|
|
|
typedef typename _DefaultZeroValue<_Tp>::_Ret _Tr2;
|
|
typedef typename _Not<_Tr2>::_Ret _Tr3;
|
|
|
|
typedef typename _Land2<_Tr1, _Tr3>::_Ret _Ret;
|
|
static _Ret _Answer() { return _Ret(); }
|
|
};
|
|
|
|
_STLP_END_NAMESPACE
|
|
|
|
#endif /* _STLP_BOOST_TYPE_TRAITS_H */
|