// Copyright (C) 2004 Arkadiy Vertleyb | |
// 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) | |
#ifndef BOOST_TYPEOF_MODIFIERS_HPP_INCLUDED | |
#define BOOST_TYPEOF_MODIFIERS_HPP_INCLUDED | |
#include <boost/typeof/encode_decode.hpp> | |
#include <boost/preprocessor/facilities/identity.hpp> | |
#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP() | |
// modifiers | |
#define BOOST_TYPEOF_modifier_support(ID, Fun)\ | |
template<class V, class T> struct encode_type_impl<V, Fun(T)>\ | |
{\ | |
typedef\ | |
typename boost::type_of::encode_type<\ | |
typename boost::type_of::push_back<\ | |
V\ | |
, boost::mpl::size_t<ID> >::type\ | |
, T>::type\ | |
type;\ | |
};\ | |
template<class Iter> struct decode_type_impl<boost::mpl::size_t<ID>, Iter>\ | |
{\ | |
typedef boost::type_of::decode_type<Iter> d1;\ | |
typedef Fun(typename d1::type) type;\ | |
typedef typename d1::iter iter;\ | |
} | |
#define BOOST_TYPEOF_const_fun(T) const T | |
#define BOOST_TYPEOF_volatile_fun(T) volatile T | |
#define BOOST_TYPEOF_volatile_const_fun(T) volatile const T | |
#define BOOST_TYPEOF_pointer_fun(T) T* | |
#define BOOST_TYPEOF_reference_fun(T) T& | |
#if defined(__BORLANDC__) && (__BORLANDC__ < 0x600) | |
//Borland incorrectly handles T const, T const volatile and T volatile. | |
//It drops the decoration no matter what, so we need to try to handle T* const etc. without loosing the top modifier. | |
#define BOOST_TYPEOF_const_pointer_fun(T) T const * | |
#define BOOST_TYPEOF_const_reference_fun(T) T const & | |
#define BOOST_TYPEOF_volatile_pointer_fun(T) T volatile* | |
#define BOOST_TYPEOF_volatile_reference_fun(T) T volatile& | |
#define BOOST_TYPEOF_volatile_const_pointer_fun(T) T volatile const * | |
#define BOOST_TYPEOF_volatile_const_reference_fun(T) T volatile const & | |
#endif | |
BOOST_TYPEOF_BEGIN_ENCODE_NS | |
BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_const_fun); | |
BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_volatile_fun); | |
BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_volatile_const_fun); | |
BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_pointer_fun); | |
BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_reference_fun); | |
#if defined(__BORLANDC__) && (__BORLANDC__ < 0x600) | |
BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_const_pointer_fun); | |
BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_const_reference_fun); | |
BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_volatile_pointer_fun); | |
BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_volatile_reference_fun); | |
BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_volatile_const_pointer_fun); | |
BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_volatile_const_reference_fun); | |
#endif | |
BOOST_TYPEOF_END_ENCODE_NS | |
#undef BOOST_TYPEOF_modifier_support | |
#undef BOOST_TYPEOF_const_fun | |
#undef BOOST_TYPEOF_volatile_fun | |
#undef BOOST_TYPEOF_volatile_const_fun | |
#undef BOOST_TYPEOF_pointer_fun | |
#undef BOOST_TYPEOF_reference_fun | |
#if defined(__BORLANDC__) && (__BORLANDC__ < 0x600) | |
#undef BOOST_TYPEOF_const_pointer_fun | |
#undef BOOST_TYPEOF_const_reference_fun | |
#undef BOOST_TYPEOF_volatile_pointer_fun | |
#undef BOOST_TYPEOF_volatile_reference_fun | |
#undef BOOST_TYPEOF_volatile_const_pointer_fun | |
#undef BOOST_TYPEOF_volatile_const_reference_fun | |
#endif | |
// arrays | |
#define BOOST_TYPEOF_array_support(ID, Qualifier)\ | |
template<class V, class T, int N>\ | |
struct encode_type_impl<V, Qualifier() T[N]>\ | |
{\ | |
typedef\ | |
typename boost::type_of::encode_type<\ | |
typename boost::type_of::push_back<\ | |
typename boost::type_of::push_back<\ | |
V\ | |
, boost::mpl::size_t<ID> >::type\ | |
, boost::mpl::size_t<N> >::type\ | |
, T>::type\ | |
type;\ | |
};\ | |
template<class Iter>\ | |
struct decode_type_impl<boost::mpl::size_t<ID>, Iter>\ | |
{\ | |
enum{n = Iter::type::value};\ | |
typedef boost::type_of::decode_type<typename Iter::next> d;\ | |
typedef typename d::type Qualifier() type[n];\ | |
typedef typename d::iter iter;\ | |
} | |
BOOST_TYPEOF_BEGIN_ENCODE_NS | |
BOOST_TYPEOF_array_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_PP_EMPTY); | |
BOOST_TYPEOF_array_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_PP_IDENTITY(const)); | |
BOOST_TYPEOF_array_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_PP_IDENTITY(volatile)); | |
BOOST_TYPEOF_array_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_PP_IDENTITY(volatile const)); | |
BOOST_TYPEOF_END_ENCODE_NS | |
#undef BOOST_TYPEOF_array_support | |
#endif//BOOST_TYPEOF_MODIFIERS_HPP_INCLUDED |