/* Copyright 2003-2008 Joaquin M Lopez Munoz. * 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/multi_index for library home page. */ #ifndef BOOST_MULTI_INDEX_DETAIL_UINTPTR_TYPE_HPP #define BOOST_MULTI_INDEX_DETAIL_UINTPTR_TYPE_HPP #if defined(_MSC_VER)&&(_MSC_VER>=1200) #pragma once #endif #include /* keep it first to prevent nasty warns in MSVC */ #include namespace boost{ namespace multi_index{ namespace detail{ /* has_uintptr_type is an MPL integral constant determining whether * there exists an unsigned integral type with the same size as * void *. * uintptr_type is such a type if has_uintptr is true, or unsigned int * otherwise. * Note that uintptr_type is more restrictive than C99 uintptr_t, * where an integral type with size greater than that of void * * would be conformant. */ templatestruct uintptr_candidates; template<>struct uintptr_candidates<-1>{typedef unsigned int type;}; template<>struct uintptr_candidates<0> {typedef unsigned int type;}; template<>struct uintptr_candidates<1> {typedef unsigned short type;}; template<>struct uintptr_candidates<2> {typedef unsigned long type;}; #if defined(BOOST_HAS_LONG_LONG) template<>struct uintptr_candidates<3> {typedef boost::ulong_long_type type;}; #else template<>struct uintptr_candidates<3> {typedef unsigned int type;}; #endif #if defined(BOOST_HAS_MS_INT64) template<>struct uintptr_candidates<4> {typedef unsigned __int64 type;}; #else template<>struct uintptr_candidates<4> {typedef unsigned int type;}; #endif struct uintptr_aux { BOOST_STATIC_CONSTANT(int,index= sizeof(void*)==sizeof(uintptr_candidates<0>::type)?0: sizeof(void*)==sizeof(uintptr_candidates<1>::type)?1: sizeof(void*)==sizeof(uintptr_candidates<2>::type)?2: sizeof(void*)==sizeof(uintptr_candidates<3>::type)?3: sizeof(void*)==sizeof(uintptr_candidates<4>::type)?4:-1); BOOST_STATIC_CONSTANT(bool,has_uintptr_type=(index>=0)); typedef uintptr_candidates::type type; }; typedef mpl::bool_ has_uintptr_type; typedef uintptr_aux::type uintptr_type; } /* namespace multi_index::detail */ } /* namespace multi_index */ } /* namespace boost */ #endif