#ifndef __NUMERIC_VOCAB__ #define __NUMERIC_VOCAB__ // Copyright (C) 2004 Graydon Hoare // // This program is made available under the GNU GPL version 2.0 or // greater. See the accompanying file COPYING for details. // // This program is distributed WITHOUT ANY WARRANTY; without even the // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // PURPOSE. #include #include // Some architectures need this for CHAR_BIT // The lack of this was reported as bug #19984 #include #include typedef TYPE_U8 u8; typedef TYPE_U16 u16; typedef TYPE_U32 u32; typedef TYPE_U64 u64; typedef TYPE_S8 s8; typedef TYPE_S16 s16; typedef TYPE_S32 s32; typedef TYPE_S64 s64; // This is similar to static_cast(v). The difference is that when T is // unsigned, this cast does not sign-extend: // static_cast((signed char) -1) = 4294967295 // widen(-1) == 255 template inline T widen(V const & v) { BOOST_STATIC_ASSERT(sizeof(T) >= sizeof(V)); if (std::numeric_limits::is_signed) return static_cast(v); else if (!std::numeric_limits::is_signed) return static_cast(v); else { const size_t char_bit = std::numeric_limits::digits; T mask = std::numeric_limits::max(); size_t shift = (sizeof(T) - sizeof(V)) * char_bit; mask >>= shift; return static_cast(v) & mask; } } // Local Variables: // mode: C++ // fill-column: 76 // c-file-style: "gnu" // indent-tabs-mode: nil // End: // vim: et:sw=2:sts=2:ts=2:cino=>2s,{s,\:s,+s,t0,g0,^-2,e-2,n-2,p2s,(0,=s: #endif