15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2005, Google Inc.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Redistribution and use in source and binary forms, with or without
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// modification, are permitted provided that the following conditions are
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// met:
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     * Redistributions of source code must retain the above copyright
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// notice, this list of conditions and the following disclaimer.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     * Redistributions in binary form must reproduce the above
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// copyright notice, this list of conditions and the following disclaimer
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the documentation and/or other materials provided with the
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// distribution.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     * Neither the name of Google Inc. nor the names of its
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// contributors may be used to endorse or promote products derived from
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this software without specific prior written permission.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef _BASICTYPES_H_
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _BASICTYPES_H_
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <config.h>
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h>       // for memcpy()
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_INTTYPES_H
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <inttypes.h>     // gets us PRId64, etc
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To use this in an autoconf setting, make sure you run the following
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// autoconf macros:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    AC_HEADER_STDC              /* for stdint_h and inttypes_h */
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    AC_CHECK_TYPES([__int64])   /* defined in some windows platforms */
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_INTTYPES_H
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <inttypes.h>           // uint16_t might be here; PRId64 too.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STDINT_H
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdint.h>             // to get uint16_t (ISO naming madness)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/types.h>          // our last best hope for uint16_t
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Standard typedefs
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// All Google code is compiled with -funsigned-char to make "char"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unsigned.  Google code therefore doesn't need a "uchar" type.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(csilvers): how do we make sure unsigned-char works on non-gcc systems?
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef signed char         schar;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int8_t              int8;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int16_t             int16;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int32_t             int32;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int64_t             int64;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTE: unsigned types are DANGEROUS in loops and other arithmetical
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// places.  Use the signed types unless your variable represents a bit
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pattern (eg a hash value) or you really need the extra bit.  Do NOT
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// use 'unsigned' to express "this value should always be positive";
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// use assertions for this.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint8_t            uint8;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint16_t           uint16;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint32_t           uint32;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint64_t           uint64;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint16 kuint16max = (   (uint16) 0xFFFF);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 kuint32max = (   (uint32) 0xFFFFFFFF);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint64 kuint64max = ( (((uint64) kuint32max) << 32) | kuint32max );
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const  int8  kint8max   = (   (  int8) 0x7F);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const  int16 kint16max  = (   ( int16) 0x7FFF);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const  int32 kint32max  = (   ( int32) 0x7FFFFFFF);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const  int64 kint64max =  ( ((( int64) kint32max) << 32) | kuint32max );
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const  int8  kint8min   = (   (  int8) 0x80);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const  int16 kint16min  = (   ( int16) 0x8000);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const  int32 kint32min  = (   ( int32) 0x80000000);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const  int64 kint64min =  ( ((( int64) kint32min) << 32) | 0 );
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Define the "portable" printf and scanf macros, if they're not
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// already there (via the inttypes.h we #included above, hopefully).
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Mostly it's old systems that don't support inttypes.h, so we assume
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// they're 32 bit.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PRIx64
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PRIx64 "llx"
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SCNx64
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SCNx64 "llx"
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PRId64
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PRId64 "lld"
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SCNd64
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SCNd64 "lld"
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PRIu64
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PRIu64 "llu"
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PRIxPTR
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PRIxPTR "lx"
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Also allow for printing of a pthread_t.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GPRIuPTHREAD "lu"
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GPRIxPTHREAD "lx"
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__CYGWIN__) || defined(__CYGWIN32__) || defined(__APPLE__) || defined(__FreeBSD__)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PRINTABLE_PTHREAD(pthreadt) reinterpret_cast<uintptr_t>(pthreadt)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PRINTABLE_PTHREAD(pthreadt) pthreadt
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A macro to disallow the evil copy constructor and operator= functions
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This should be used in the private: declarations for a class
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DISALLOW_EVIL_CONSTRUCTORS(TypeName)    \
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TypeName(const TypeName&);                    \
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void operator=(const TypeName&)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An alternate name that leaves out the moral judgment... :-)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DISALLOW_COPY_AND_ASSIGN(TypeName) DISALLOW_EVIL_CONSTRUCTORS(TypeName)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The COMPILE_ASSERT macro can be used to verify that a compile time
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// expression is true. For example, you could use it to verify the
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// size of a static array:
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   COMPILE_ASSERT(sizeof(num_content_type_names) == sizeof(int),
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                  content_type_names_incorrect_size);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// or to make sure a struct is smaller than a certain size:
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   COMPILE_ASSERT(sizeof(foo) < 128, foo_too_large);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The second argument to the macro is the name of the variable. If
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the expression is false, most compilers will issue a warning/error
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// containing the name of the variable.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Implementation details of COMPILE_ASSERT:
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - COMPILE_ASSERT works by defining an array type that has -1
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   elements (and thus is invalid) when the expression is false.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The simpler definition
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     #define COMPILE_ASSERT(expr, msg) typedef char msg[(expr) ? 1 : -1]
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   does not work, as gcc supports variable-length arrays whose sizes
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   are determined at run-time (this is gcc's extension and not part
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   of the C++ standard).  As a result, gcc fails to reject the
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   following code with the simple definition:
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     int foo;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     COMPILE_ASSERT(foo, msg); // not supposed to compile as foo is
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                               // not a compile-time constant.
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - By using the type CompileAssert<(bool(expr))>, we ensures that
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   expr is a compile-time constant.  (Template arguments must be
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   determined at compile-time.)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The outter parentheses in CompileAssert<(bool(expr))> are necessary
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   to work around a bug in gcc 3.4.4 and 4.0.1.  If we had written
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     CompileAssert<bool(expr)>
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   instead, these compilers will refuse to compile
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     COMPILE_ASSERT(5 > 0, some_message);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   (They seem to think the ">" in "5 > 0" marks the end of the
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   template argument list.)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The array size is (bool(expr) ? 1 : -1), instead of simply
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     ((expr) ? 1 : -1).
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   This is to avoid running into a bug in MS VC 7.1, which
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <bool>
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct CompileAssert {
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define COMPILE_ASSERT(expr, msg)                               \
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1]
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define arraysize(a)  (sizeof(a) / sizeof(*(a)))
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define OFFSETOF_MEMBER(strct, field)                                   \
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   (reinterpret_cast<char*>(&reinterpret_cast<strct*>(16)->field) -     \
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reinterpret_cast<char*>(16))
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bit_cast<Dest,Source> implements the equivalent of
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "*reinterpret_cast<Dest*>(&source)".
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The reinterpret_cast method would produce undefined behavior
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// according to ISO C++ specification section 3.10 -15 -.
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bit_cast<> calls memcpy() which is blessed by the standard,
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// especially by the example in section 3.9.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fortunately memcpy() is very fast.  In optimized mode, with a
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// constant size, gcc 2.95.3, gcc 4.0.1, and msvc 7.1 produce inline
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// code with the minimal amount of data movement.  On a 32-bit system,
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// memcpy(d,s,4) compiles to one load and one store, and memcpy(d,s,8)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// compiles to two loads and two stores.
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class Dest, class Source>
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Dest bit_cast(const Source& source) {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPILE_ASSERT(sizeof(Dest) == sizeof(Source), bitcasting_unequal_sizes);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Dest dest;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(&dest, &source, sizeof(dest));
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return dest;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE___ATTRIBUTE__
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ATTRIBUTE_WEAK      __attribute__((weak))
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ATTRIBUTE_NOINLINE  __attribute__((noinline))
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ATTRIBUTE_WEAK
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ATTRIBUTE_NOINLINE
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Section attributes are supported for both ELF and Mach-O, but in
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// very different ways.  Here's the API we provide:
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1) ATTRIBUTE_SECTION: put this with the declaration of all functions
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    you want to be in the same linker section
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2) DEFINE_ATTRIBUTE_SECTION_VARS: must be called once per unique
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    name.  You want to make sure this is executed before any
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    DECLARE_ATTRIBUTE_SECTION_VARS; the easiest way is to put them
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    in the same .cc file.  Put this call at the global level.
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3) INIT_ATTRIBUTE_SECTION_VARS: you can scatter calls to this in
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    multiple places to help ensure execution before any
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    DECLARE_ATTRIBUTE_SECTION_VARS.  You must have at least one
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    DEFINE, but you can have many INITs.  Put each in its own scope.
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 4) DECLARE_ATTRIBUTE_SECTION_VARS: must be called before using
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    ATTRIBUTE_SECTION_START or ATTRIBUTE_SECTION_STOP on a name.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    Put this call at the global level.
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 5) ATTRIBUTE_SECTION_START/ATTRIBUTE_SECTION_STOP: call this to say
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    where in memory a given section is.  All functions declared with
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    ATTRIBUTE_SECTION are guaranteed to be between START and STOP.
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(HAVE___ATTRIBUTE__) && defined(__ELF__)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ATTRIBUTE_SECTION(name) __attribute__ ((section (#name)))
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Weak section declaration to be used as a global declaration
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for ATTRIBUTE_SECTION_START|STOP(name) to compile and link
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // even without functions with ATTRIBUTE_SECTION(name).
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define DECLARE_ATTRIBUTE_SECTION_VARS(name) \
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extern char __start_##name[] ATTRIBUTE_WEAK; \
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extern char __stop_##name[] ATTRIBUTE_WEAK
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define INIT_ATTRIBUTE_SECTION_VARS(name)     // no-op for ELF
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define DEFINE_ATTRIBUTE_SECTION_VARS(name)   // no-op for ELF
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return void* pointers to start/end of a section of code with functions
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // having ATTRIBUTE_SECTION(name), or 0 if no such function exists.
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // One must DECLARE_ATTRIBUTE_SECTION(name) for this to compile and link.
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ATTRIBUTE_SECTION_START(name) (reinterpret_cast<void*>(__start_##name))
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ATTRIBUTE_SECTION_STOP(name) (reinterpret_cast<void*>(__stop_##name))
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define HAVE_ATTRIBUTE_SECTION_START 1
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(HAVE___ATTRIBUTE__) && defined(__MACH__)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ATTRIBUTE_SECTION(name) __attribute__ ((section ("__TEXT, " #name)))
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <mach-o/getsect.h>
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <mach-o/dyld.h>
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AssignAttributeStartEnd {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssignAttributeStartEnd(const char* name, char** pstart, char** pend) {
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Find out what dynamic library name is defined in
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (_dyld_present()) {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (int i = _dyld_image_count() - 1; i >= 0; --i) {
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const mach_header* hdr = _dyld_get_image_header(i);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef MH_MAGIC_64
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (hdr->magic == MH_MAGIC_64) {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          uint64_t len;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          *pstart = getsectdatafromheader_64((mach_header_64*)hdr,
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             "__TEXT", name, &len);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (*pstart) {   // NULL if not defined in this dynamic library
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *pstart += _dyld_get_image_vmaddr_slide(i);   // correct for reloc
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *pend = *pstart + len;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (hdr->magic == MH_MAGIC) {
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          uint32_t len;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          *pstart = getsectdatafromheader(hdr, "__TEXT", name, &len);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (*pstart) {   // NULL if not defined in this dynamic library
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *pstart += _dyld_get_image_vmaddr_slide(i);   // correct for reloc
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *pend = *pstart + len;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If we get here, not defined in a dll at all.  See if defined statically.
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned long len;    // don't ask me why this type isn't uint32_t too...
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *pstart = getsectdata("__TEXT", name, &len);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *pend = *pstart + len;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DECLARE_ATTRIBUTE_SECTION_VARS(name)    \
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extern char* __start_##name;                  \
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extern char* __stop_##name
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define INIT_ATTRIBUTE_SECTION_VARS(name)               \
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DECLARE_ATTRIBUTE_SECTION_VARS(name);                 \
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const AssignAttributeStartEnd __assign_##name( \
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #name, &__start_##name, &__stop_##name)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEFINE_ATTRIBUTE_SECTION_VARS(name)     \
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char* __start_##name, *__stop_##name;         \
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  INIT_ATTRIBUTE_SECTION_VARS(name)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ATTRIBUTE_SECTION_START(name) (reinterpret_cast<void*>(__start_##name))
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ATTRIBUTE_SECTION_STOP(name) (reinterpret_cast<void*>(__stop_##name))
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define HAVE_ATTRIBUTE_SECTION_START 1
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else  // not HAVE___ATTRIBUTE__ && __ELF__, nor HAVE___ATTRIBUTE__ && __MACH__
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ATTRIBUTE_SECTION(name)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define DECLARE_ATTRIBUTE_SECTION_VARS(name)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define INIT_ATTRIBUTE_SECTION_VARS(name)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define DEFINE_ATTRIBUTE_SECTION_VARS(name)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ATTRIBUTE_SECTION_START(name) (reinterpret_cast<void*>(0))
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ATTRIBUTE_SECTION_STOP(name) (reinterpret_cast<void*>(0))
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // HAVE___ATTRIBUTE__ and __ELF__ or __MACH__
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(HAVE___ATTRIBUTE__) && (defined(__i386__) || defined(__x86_64__))
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define CACHELINE_ALIGNED __attribute__((aligned(64)))
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define CACHELINE_ALIGNED
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(HAVE___ATTRIBUTE__) && (__i386__ || __x86_64__)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following enum should be used only as a constructor argument to indicate
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that the variable has static storage class, and that the constructor should
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// do nothing to its state.  It indicates to the reader that it is legal to
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// declare a static nistance of the class, provided the constructor is given
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the base::LINKER_INITIALIZED argument.  Normally, it is unsafe to declare a
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static variable that has a constructor or a destructor because invocation
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// order is undefined.  However, IF the type can be initialized by filling with
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// zeroes (which the loader does for static variables), AND the destructor also
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// does nothing to the storage, then a constructor declared as
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       explicit MyClass(base::LinkerInitialized x) {}
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and invoked as
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       static MyClass my_variable_name(base::LINKER_INITIALIZED);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum LinkerInitialized { LINKER_INITIALIZED };
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // _BASICTYPES_H_
358