/*-----------------------------------------------------------------------------+ | |
Copyright (c) 2010-2010: Joachim Faulhaber | |
+------------------------------------------------------------------------------+ | |
Distributed under the Boost Software License, Version 1.0. | |
(See accompanying file LICENCE.txt or copy at | |
http://www.boost.org/LICENSE_1_0.txt) | |
+-----------------------------------------------------------------------------*/ | |
#ifndef BOOST_ICL_TYPE_TRAITS_IS_INTERVAL_HPP_JOFA_100327 | |
#define BOOST_ICL_TYPE_TRAITS_IS_INTERVAL_HPP_JOFA_100327 | |
#include <boost/mpl/or.hpp> | |
#include <boost/icl/interval_bounds.hpp> | |
#include <boost/icl/interval_traits.hpp> | |
namespace boost{ namespace icl | |
{ | |
template <class Type> | |
struct interval_bound_type | |
{ | |
typedef interval_bound_type type; | |
BOOST_STATIC_CONSTANT(bound_type, value = (interval_bounds::undefined)); | |
}; | |
template <class Type> struct is_interval | |
{ | |
typedef is_interval<Type> type; | |
BOOST_STATIC_CONSTANT(bool, | |
value = ((interval_bound_type<Type>::value) < interval_bounds::undefined)); | |
}; | |
template <class Type> struct has_static_bounds | |
{ | |
typedef has_static_bounds<Type> type; | |
BOOST_STATIC_CONSTANT(bool, | |
value = ((interval_bound_type<Type>::value) < interval_bounds::dynamic)); | |
}; | |
template <class Type> struct has_dynamic_bounds | |
{ | |
typedef has_dynamic_bounds<Type> type; | |
BOOST_STATIC_CONSTANT(bool, | |
value = (interval_bound_type<Type>::value == interval_bounds::dynamic)); | |
}; | |
template <class Type> struct has_asymmetric_bounds | |
{ | |
typedef has_asymmetric_bounds<Type> type; | |
BOOST_STATIC_CONSTANT(bound_type, bounds = (interval_bound_type<Type>::value)); | |
BOOST_STATIC_CONSTANT(bool, | |
value = ( bounds == interval_bounds::static_left_open | |
|| bounds == interval_bounds::static_right_open)); | |
}; | |
template <class Type> struct has_symmetric_bounds | |
{ | |
typedef has_symmetric_bounds<Type> type; | |
BOOST_STATIC_CONSTANT(bound_type, bounds = (interval_bound_type<Type>::value)); | |
BOOST_STATIC_CONSTANT(bool, | |
value = ( bounds == interval_bounds::static_closed | |
|| bounds == interval_bounds::static_open)); | |
}; | |
//------------------------------------------------------------------------------ | |
template <class Type> struct is_discrete_static | |
{ | |
typedef is_discrete_static type; | |
typedef typename interval_traits<Type>::domain_type domain_type; | |
BOOST_STATIC_CONSTANT(bool, | |
value = (mpl::and_< has_static_bounds<Type> | |
, is_discrete<domain_type> >::value) ); | |
}; | |
//------------------------------------------------------------------------------ | |
template <class Type> struct is_continuous_static | |
{ | |
typedef is_continuous_static type; | |
typedef typename interval_traits<Type>::domain_type domain_type; | |
BOOST_STATIC_CONSTANT(bool, | |
value = (mpl::and_< has_static_bounds<Type> | |
, is_continuous<domain_type> | |
, has_asymmetric_bounds<Type> >::value) ); | |
}; | |
//------------------------------------------------------------------------------ | |
template <class Type> struct is_static_right_open | |
{ | |
typedef is_static_right_open<Type> type; | |
BOOST_STATIC_CONSTANT(bool, | |
value = (interval_bound_type<Type>::value == interval_bounds::static_right_open)); | |
}; | |
template <class Type> struct is_static_left_open | |
{ | |
typedef is_static_left_open<Type> type; | |
BOOST_STATIC_CONSTANT(bool, | |
value = (interval_bound_type<Type>::value == interval_bounds::static_left_open)); | |
}; | |
template <class Type> struct is_static_open | |
{ | |
typedef is_static_open<Type> type; | |
BOOST_STATIC_CONSTANT(bool, | |
value = (interval_bound_type<Type>::value == interval_bounds::static_open)); | |
}; | |
template <class Type> struct is_static_closed | |
{ | |
typedef is_static_closed<Type> type; | |
BOOST_STATIC_CONSTANT(bool, | |
value = (interval_bound_type<Type>::value == interval_bounds::static_closed)); | |
}; | |
template <class Type> struct is_discrete_static_closed | |
{ | |
typedef is_static_closed<Type> type; | |
typedef typename interval_traits<Type>::domain_type domain_type; | |
BOOST_STATIC_CONSTANT( bool, | |
value = (mpl::and_< is_static_closed<Type> | |
, is_discrete<domain_type> >::value) ); | |
}; | |
template <class Type> struct is_discrete_static_open | |
{ | |
typedef is_static_closed<Type> type; | |
typedef typename interval_traits<Type>::domain_type domain_type; | |
BOOST_STATIC_CONSTANT( bool, | |
value = (mpl::and_< is_static_open<Type> | |
, is_discrete<domain_type> >::value) ); | |
}; | |
//------------------------------------------------------------------------------ | |
template <class Type> struct is_continuous_right_open | |
{ | |
typedef is_continuous_right_open<Type> type; | |
typedef typename interval_traits<Type>::domain_type domain_type; | |
BOOST_STATIC_CONSTANT(bool, | |
value = (mpl::and_<is_static_right_open<Type>, is_continuous<domain_type> >::value)); | |
}; | |
template <class Type> struct is_continuous_left_open | |
{ | |
typedef is_continuous_left_open<Type> type; | |
typedef typename interval_traits<Type>::domain_type domain_type; | |
BOOST_STATIC_CONSTANT(bool, | |
value = (mpl::and_<is_static_left_open<Type>, is_continuous<domain_type> >::value)); | |
}; | |
//------------------------------------------------------------------------------ | |
template <class Type> struct is_singelizable | |
{ | |
typedef is_singelizable type; | |
typedef typename interval_traits<Type>::domain_type domain_type; | |
BOOST_STATIC_CONSTANT(bool, | |
value = | |
(mpl::or_< has_dynamic_bounds<Type> | |
, is_discrete<domain_type> | |
>::value) | |
); | |
}; | |
}} // namespace boost icl | |
#endif | |