1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc.  All rights reserved.
3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// http://code.google.com/p/protobuf/
4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without
6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are
7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met:
8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions of source code must retain the above copyright
10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer.
11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions in binary form must reproduce the above
12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer
13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the
14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution.
15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Neither the name of Google Inc. nor the names of its
16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from
17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission.
18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: kenton@google.com (Kenton Varda) and others
32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Contains basic types and utilities used by the rest of the library.
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifndef GOOGLE_PROTOBUF_COMMON_H__
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_PROTOBUF_COMMON_H__
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <assert.h>
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <stdlib.h>
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <cstddef>
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <string>
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <string.h>
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#if defined(__osf__)
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tru64 lacks stdint.h, but has inttypes.h which defines a superset of
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// what stdint.h would define.
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <inttypes.h>
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#elif !defined(_MSC_VER)
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <stdint.h>
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace std {}
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google {
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf {
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing namespace std;  // Don't do this at home, kids.
57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef GOOGLE_DISALLOW_EVIL_CONSTRUCTORS
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TypeName)    \
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TypeName(const TypeName&);                           \
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void operator=(const TypeName&)
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#if defined(_MSC_VER) && defined(PROTOBUF_USE_DLLS)
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  #ifdef LIBPROTOBUF_EXPORTS
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #define LIBPROTOBUF_EXPORT __declspec(dllexport)
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  #else
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #define LIBPROTOBUF_EXPORT __declspec(dllimport)
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  #endif
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  #ifdef LIBPROTOC_EXPORTS
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #define LIBPROTOC_EXPORT   __declspec(dllexport)
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  #else
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #define LIBPROTOC_EXPORT   __declspec(dllimport)
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  #endif
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#else
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  #define LIBPROTOBUF_EXPORT
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  #define LIBPROTOC_EXPORT
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace internal {
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Some of these constants are macros rather than const ints so that they can
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// be used in #if directives.
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The current version, represented as a single integer to make comparison
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// easier:  major * 10^6 + minor * 10^3 + micro
86d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#define GOOGLE_PROTOBUF_VERSION 2003000
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The minimum library version which works with the current version of the
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// headers.
90d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#define GOOGLE_PROTOBUF_MIN_LIBRARY_VERSION 2003000
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The minimum header version which works with the current version of
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// the library.  This constant should only be used by protoc's C++ code
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// generator.
95d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savillestatic const int kMinHeaderVersionForLibrary = 2003000;
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The minimum protoc version which works with the current version of the
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// headers.
99d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#define GOOGLE_PROTOBUF_MIN_PROTOC_VERSION 2003000
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The minimum header version which works with the current version of
102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// protoc.  This constant should only be used in VerifyVersion().
103d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savillestatic const int kMinHeaderVersionForProtoc = 2003000;
104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Verifies that the headers and libraries are compatible.  Use the macro
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// below to call this.
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid LIBPROTOBUF_EXPORT VerifyVersion(int headerVersion, int minLibraryVersion,
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                      const char* filename);
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Converts a numeric version number to a string.
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring LIBPROTOBUF_EXPORT VersionString(int version);
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace internal
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Place this macro in your main() function (or somewhere before you attempt
116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// to use the protobuf library) to verify that the version you link against
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// matches the headers you compiled against.  If a version mismatch is
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// detected, the process will abort.
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_PROTOBUF_VERIFY_VERSION                                    \
120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ::google::protobuf::internal::VerifyVersion(                            \
121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GOOGLE_PROTOBUF_VERSION, GOOGLE_PROTOBUF_MIN_LIBRARY_VERSION,         \
122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    __FILE__)
123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// from google3/base/port.h
126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef unsigned int uint;
128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifdef _MSC_VER
130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef __int8  int8;
131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef __int16 int16;
132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef __int32 int32;
133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef __int64 int64;
134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef unsigned __int8  uint8;
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef unsigned __int16 uint16;
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef unsigned __int32 uint32;
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef unsigned __int64 uint64;
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#else
140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef int8_t  int8;
141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef int16_t int16;
142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef int32_t int32;
143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef int64_t int64;
144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef uint8_t  uint8;
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef uint16_t uint16;
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef uint32_t uint32;
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef uint64_t uint64;
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// long long macros to be used because gcc and vc++ use different suffixes,
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// and different size specifiers in format strings
153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef GOOGLE_LONGLONG
154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef GOOGLE_ULONGLONG
155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef GOOGLE_LL_FORMAT
156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifdef _MSC_VER
158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_LONGLONG(x) x##I64
159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_ULONGLONG(x) x##UI64
160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_LL_FORMAT "I64"  // As in printf("%I64d", ...)
161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#else
162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_LONGLONG(x) x##LL
163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_ULONGLONG(x) x##ULL
164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_LL_FORMAT "ll"  // As in "%lld". Note that "q" is poor form also.
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif
166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestatic const int32 kint32max = 0x7FFFFFFF;
168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestatic const int32 kint32min = -kint32max - 1;
169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestatic const int64 kint64max = GOOGLE_LONGLONG(0x7FFFFFFFFFFFFFFF);
170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestatic const int64 kint64min = -kint64max - 1;
171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestatic const uint32 kuint32max = 0xFFFFFFFFu;
172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestatic const uint64 kuint64max = GOOGLE_ULONGLONG(0xFFFFFFFFFFFFFFFF);
173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
174d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// -------------------------------------------------------------------
175d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// Annotations:  Some parts of the code have been annotated in ways that might
176d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville//   be useful to some compilers or tools, but are not supported universally.
177d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville//   You can #define these annotations yourself if the default implementation
178d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville//   is not right for you.
179d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
180d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#ifndef GOOGLE_ATTRIBUTE_ALWAYS_INLINE
181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#if defined(__GNUC__) && (__GNUC__ > 3 ||(__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// For functions we want to force inline.
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Introduced in gcc 3.1.
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_ATTRIBUTE_ALWAYS_INLINE __attribute__ ((always_inline))
185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#else
186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Other compilers will have to figure it out for themselves.
187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_ATTRIBUTE_ALWAYS_INLINE
188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif
189d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#endif
190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
191d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#ifndef GOOGLE_ATTRIBUTE_DEPRECATED
192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifdef __GNUC__
193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// If the method/variable/type is used anywhere, produce a warning.
194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_ATTRIBUTE_DEPRECATED __attribute__((deprecated))
195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#else
196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_ATTRIBUTE_DEPRECATED
197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif
198d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#endif
199d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
200d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#ifndef GOOGLE_PREDICT_TRUE
201d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#ifdef __GNUC__
202d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// Provided at least since GCC 3.0.
203d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#define GOOGLE_PREDICT_TRUE(x) (__builtin_expect(!!(x), 1))
204d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#else
205d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#define GOOGLE_PREDICT_TRUE
206d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#endif
207d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#endif
208d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
209d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// Delimits a block of code which may write to memory which is simultaneously
210d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// written by other threads, but which has been determined to be thread-safe
211d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// (e.g. because it is an idempotent write).
212d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#ifndef GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN
213d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#define GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN()
214d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#endif
215d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#ifndef GOOGLE_SAFE_CONCURRENT_WRITES_END
216d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#define GOOGLE_SAFE_CONCURRENT_WRITES_END()
217d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#endif
218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// from google3/base/basictypes.h
221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The GOOGLE_ARRAYSIZE(arr) macro returns the # of elements in an array arr.
223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The expression is a compile-time constant, and therefore can be
224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// used in defining new arrays, for example.
225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// GOOGLE_ARRAYSIZE catches a few type errors.  If you see a compiler error
227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   "warning: division by zero in ..."
229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// when using GOOGLE_ARRAYSIZE, you are (wrongfully) giving it a pointer.
231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// You should only use GOOGLE_ARRAYSIZE on statically allocated arrays.
232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The following comments are on the implementation details, and can
234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// be ignored by the users.
235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ARRAYSIZE(arr) works by inspecting sizeof(arr) (the # of bytes in
237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// the array) and sizeof(*(arr)) (the # of bytes in one array
238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// element).  If the former is divisible by the latter, perhaps arr is
239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// indeed an array, in which case the division result is the # of
240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// elements in the array.  Otherwise, arr cannot possibly be an array,
241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// and we generate a compiler error to prevent the code from
242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// compiling.
243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Since the size of bool is implementation-defined, we need to cast
245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// !(sizeof(a) & sizeof(*(a))) to size_t in order to ensure the final
246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// result has type size_t.
247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This macro is not perfect as it wrongfully accepts certain
249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// pointers, namely where the pointer size is divisible by the pointee
250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// size.  Since all our code has to go through a 32-bit compiler,
251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// where a pointer is 4 bytes, this means all pointers to a type whose
252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// size is 3 or greater than 4 will be (righteously) rejected.
253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Kudos to Jorg Brown for this simple and elegant implementation.
255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef GOOGLE_ARRAYSIZE
257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_ARRAYSIZE(a) \
258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ((sizeof(a) / sizeof(*(a))) / \
259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))
260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace internal {
262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Use implicit_cast as a safe version of static_cast or const_cast
264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// for upcasting in the type hierarchy (i.e. casting a pointer to Foo
265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// to a pointer to SuperclassOfFoo or casting a pointer to Foo to
266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// a const pointer to Foo).
267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// When you use implicit_cast, the compiler checks that the cast is safe.
268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Such explicit implicit_casts are necessary in surprisingly many
269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// situations where C++ demands an exact type match instead of an
270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// argument type convertable to a target type.
271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The From type can be inferred, so the preferred syntax for using
273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// implicit_cast is the same as for static_cast etc.:
274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   implicit_cast<ToType>(expr)
276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// implicit_cast would have been part of the C++ standard library,
278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// but the proposal was submitted too late.  It will probably make
279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// its way into the language in the future.
280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate<typename To, typename From>
281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline To implicit_cast(From const &f) {
282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return f;
283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// When you upcast (that is, cast a pointer from type Foo to type
286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SuperclassOfFoo), it's fine to use implicit_cast<>, since upcasts
287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// always succeed.  When you downcast (that is, cast a pointer from
288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because
289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// how do you know the pointer is really of type SubclassOfFoo?  It
290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// could be a bare Foo, or of type DifferentSubclassOfFoo.  Thus,
291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// when you downcast, you should use this macro.  In debug mode, we
292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// use dynamic_cast<> to double-check the downcast is legal (we die
293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// if it's not).  In normal mode, we do the efficient static_cast<>
294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// instead.  Thus, it's important to test in debug mode to make sure
295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// the cast is legal!
296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//    This is the only place in the code we should use dynamic_cast<>.
297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// In particular, you SHOULDN'T be using dynamic_cast<> in order to
298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// do RTTI (eg code like this:
299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//    if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo);
300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//    if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo);
301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// You should design the code some other way not to need this.
302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate<typename To, typename From>     // use like this: down_cast<T*>(foo);
304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline To down_cast(From* f) {                   // so we only accept pointers
305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Ensures that To is a sub-type of From *.  This test is here only
306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // for compile-time type checking, and has no overhead in an
307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // optimized build at run-time, as it will be optimized away
308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // completely.
309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (false) {
310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    implicit_cast<From*, To>(0);
311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
313d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#if !defined(NDEBUG) && !defined(GOOGLE_PROTOBUF_NO_RTTI)
314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  assert(f == NULL || dynamic_cast<To>(f) != NULL);  // RTTI: debug mode only!
315d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#endif
316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return static_cast<To>(f);
317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace internal
320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// We made these internal so that they would show up as such in the docs,
322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// but we don't want to stick "internal::" in front of them everywhere.
323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing internal::implicit_cast;
324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing internal::down_cast;
325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The COMPILE_ASSERT macro can be used to verify that a compile time
327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// expression is true. For example, you could use it to verify the
328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// size of a static array:
329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   COMPILE_ASSERT(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES,
331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//                  content_type_names_incorrect_size);
332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// or to make sure a struct is smaller than a certain size:
334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   COMPILE_ASSERT(sizeof(foo) < 128, foo_too_large);
336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The second argument to the macro is the name of the variable. If
338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// the expression is false, most compilers will issue a warning/error
339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// containing the name of the variable.
340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace internal {
342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <bool>
344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestruct CompileAssert {
345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace internal
348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef GOOGLE_COMPILE_ASSERT
350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_COMPILE_ASSERT(expr, msg) \
351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typedef ::google::protobuf::internal::CompileAssert<(bool(expr))> \
352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          msg[bool(expr) ? 1 : -1]
353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Implementation details of COMPILE_ASSERT:
355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// - COMPILE_ASSERT works by defining an array type that has -1
357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   elements (and thus is invalid) when the expression is false.
358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// - The simpler definition
360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     #define COMPILE_ASSERT(expr, msg) typedef char msg[(expr) ? 1 : -1]
362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   does not work, as gcc supports variable-length arrays whose sizes
364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   are determined at run-time (this is gcc's extension and not part
365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   of the C++ standard).  As a result, gcc fails to reject the
366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   following code with the simple definition:
367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     int foo;
369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     COMPILE_ASSERT(foo, msg); // not supposed to compile as foo is
370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//                               // not a compile-time constant.
371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// - By using the type CompileAssert<(bool(expr))>, we ensures that
373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   expr is a compile-time constant.  (Template arguments must be
374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   determined at compile-time.)
375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// - The outter parentheses in CompileAssert<(bool(expr))> are necessary
377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   to work around a bug in gcc 3.4.4 and 4.0.1.  If we had written
378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     CompileAssert<bool(expr)>
380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   instead, these compilers will refuse to compile
382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     COMPILE_ASSERT(5 > 0, some_message);
384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   (They seem to think the ">" in "5 > 0" marks the end of the
386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   template argument list.)
387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// - The array size is (bool(expr) ? 1 : -1), instead of simply
389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     ((expr) ? 1 : -1).
391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   This is to avoid running into a bug in MS VC 7.1, which
393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.
394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// from google3/base/scoped_ptr.h
397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace internal {
399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  This is an implementation designed to match the anticipated future TR2
401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  implementation of the scoped_ptr class, and its closely-related brethren,
402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  scoped_array, scoped_ptr_malloc, and make_scoped_ptr.
403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <class C> class scoped_ptr;
405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <class C> class scoped_array;
406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A scoped_ptr<T> is like a T*, except that the destructor of scoped_ptr<T>
408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// automatically deletes the pointer it holds (if any).
409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// That is, scoped_ptr<T> owns the T object that it points to.
410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Like a T*, a scoped_ptr<T> may hold either NULL or a pointer to a T object.
411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The size of a scoped_ptr is small:
413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// sizeof(scoped_ptr<C>) == sizeof(C*)
414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <class C>
415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass scoped_ptr {
416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The element type
419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typedef C element_type;
420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Constructor.  Defaults to intializing with NULL.
422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // There is no way to create an uninitialized scoped_ptr.
423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The input parameter must be allocated with new.
424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  explicit scoped_ptr(C* p = NULL) : ptr_(p) { }
425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Destructor.  If there is a C object, delete it.
427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // We don't need to test ptr_ == NULL because C++ does that for us.
428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ~scoped_ptr() {
429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    enum { type_must_be_complete = sizeof(C) };
430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    delete ptr_;
431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Reset.  Deletes the current owned object, if any.
434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Then takes ownership of a new object, if given.
435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // this->reset(this->get()) works.
436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void reset(C* p = NULL) {
437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (p != ptr_) {
438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      enum { type_must_be_complete = sizeof(C) };
439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      delete ptr_;
440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ptr_ = p;
441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Accessors to get the owned object.
445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // operator* and operator-> will assert() if there is no current object.
446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  C& operator*() const {
447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assert(ptr_ != NULL);
448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return *ptr_;
449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  C* operator->() const  {
451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assert(ptr_ != NULL);
452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ptr_;
453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  C* get() const { return ptr_; }
455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Comparison operators.
457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // These return whether two scoped_ptr refer to the same object, not just to
458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // two different but equal objects.
459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool operator==(C* p) const { return ptr_ == p; }
460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool operator!=(C* p) const { return ptr_ != p; }
461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Swap two scoped pointers.
463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void swap(scoped_ptr& p2) {
464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    C* tmp = ptr_;
465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ptr_ = p2.ptr_;
466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    p2.ptr_ = tmp;
467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Release a pointer.
470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The return value is the current pointer held by this object.
471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // If this object holds a NULL pointer, the return value is NULL.
472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // After this operation, this object will hold a NULL pointer,
473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // and will not own the object any more.
474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  C* release() {
475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    C* retVal = ptr_;
476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ptr_ = NULL;
477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return retVal;
478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  C* ptr_;
482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Forbid comparison of scoped_ptr types.  If C2 != C, it totally doesn't
484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // make sense, and if C2 == C, it still doesn't make sense because you should
485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // never have the same object owned by two different scoped_ptrs.
486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <class C2> bool operator==(scoped_ptr<C2> const& p2) const;
487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <class C2> bool operator!=(scoped_ptr<C2> const& p2) const;
488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Disallow evil constructors
490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  scoped_ptr(const scoped_ptr&);
491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void operator=(const scoped_ptr&);
492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// scoped_array<C> is like scoped_ptr<C>, except that the caller must allocate
495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// with new [] and the destructor deletes objects with delete [].
496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// As with scoped_ptr<C>, a scoped_array<C> either points to an object
498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// or is NULL.  A scoped_array<C> owns the object that it points to.
499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Size: sizeof(scoped_array<C>) == sizeof(C*)
501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <class C>
502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass scoped_array {
503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The element type
506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typedef C element_type;
507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Constructor.  Defaults to intializing with NULL.
509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // There is no way to create an uninitialized scoped_array.
510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The input parameter must be allocated with new [].
511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  explicit scoped_array(C* p = NULL) : array_(p) { }
512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Destructor.  If there is a C object, delete it.
514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // We don't need to test ptr_ == NULL because C++ does that for us.
515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ~scoped_array() {
516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    enum { type_must_be_complete = sizeof(C) };
517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    delete[] array_;
518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Reset.  Deletes the current owned object, if any.
521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Then takes ownership of a new object, if given.
522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // this->reset(this->get()) works.
523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void reset(C* p = NULL) {
524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (p != array_) {
525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      enum { type_must_be_complete = sizeof(C) };
526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      delete[] array_;
527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      array_ = p;
528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Get one element of the current object.
532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Will assert() if there is no current object, or index i is negative.
533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  C& operator[](std::ptrdiff_t i) const {
534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assert(i >= 0);
535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assert(array_ != NULL);
536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return array_[i];
537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Get a pointer to the zeroth element of the current object.
540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // If there is no current object, return NULL.
541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  C* get() const {
542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return array_;
543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Comparison operators.
546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // These return whether two scoped_array refer to the same object, not just to
547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // two different but equal objects.
548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool operator==(C* p) const { return array_ == p; }
549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool operator!=(C* p) const { return array_ != p; }
550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Swap two scoped arrays.
552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void swap(scoped_array& p2) {
553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    C* tmp = array_;
554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    array_ = p2.array_;
555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    p2.array_ = tmp;
556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Release an array.
559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The return value is the current pointer held by this object.
560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // If this object holds a NULL pointer, the return value is NULL.
561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // After this operation, this object will hold a NULL pointer,
562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // and will not own the object any more.
563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  C* release() {
564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    C* retVal = array_;
565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    array_ = NULL;
566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return retVal;
567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  C* array_;
571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Forbid comparison of different scoped_array types.
573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <class C2> bool operator==(scoped_array<C2> const& p2) const;
574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <class C2> bool operator!=(scoped_array<C2> const& p2) const;
575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Disallow evil constructors
577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  scoped_array(const scoped_array&);
578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void operator=(const scoped_array&);
579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace internal
582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// We made these internal so that they would show up as such in the docs,
584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// but we don't want to stick "internal::" in front of them everywhere.
585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing internal::scoped_ptr;
586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing internal::scoped_array;
587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// emulates google3/base/logging.h
590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleenum LogLevel {
592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  LOGLEVEL_INFO,     // Informational.  This is never actually used by
593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                     // libprotobuf.
594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  LOGLEVEL_WARNING,  // Warns about issues that, although not technically a
595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                     // problem now, could cause problems in the future.  For
596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                     // example, a // warning will be printed when parsing a
597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                     // message that is near the message size limit.
598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  LOGLEVEL_ERROR,    // An error occurred which should never happen during
599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                     // normal use.
600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  LOGLEVEL_FATAL,    // An error occurred from which the library cannot
601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                     // recover.  This usually indicates a programming error
602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                     // in the code which calls the library, especially when
603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                     // compiled in debug mode.
604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifdef NDEBUG
606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  LOGLEVEL_DFATAL = LOGLEVEL_ERROR
607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#else
608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  LOGLEVEL_DFATAL = LOGLEVEL_FATAL
609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif
610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace internal {
613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LogFinisher;
615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT LogMessage {
617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  LogMessage(LogLevel level, const char* filename, int line);
619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ~LogMessage();
620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  LogMessage& operator<<(const string& value);
622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  LogMessage& operator<<(const char* value);
623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  LogMessage& operator<<(char value);
624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  LogMessage& operator<<(int value);
625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  LogMessage& operator<<(uint value);
626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  LogMessage& operator<<(long value);
627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  LogMessage& operator<<(unsigned long value);
628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  LogMessage& operator<<(double value);
629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class LogFinisher;
632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void Finish();
633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  LogLevel level_;
635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const char* filename_;
636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int line_;
637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string message_;
638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Used to make the entire "LOG(BLAH) << etc." expression have a void return
641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// type and print a newline after each message.
642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT LogFinisher {
643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void operator=(LogMessage& other);
645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace internal
648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Undef everything in case we're being mixed with some other Google library
650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// which already defined them itself.  Presumably all Google libraries will
651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// support the same syntax for these so it should not be a big deal if they
652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// end up using our definitions instead.
653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef GOOGLE_LOG
654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef GOOGLE_LOG_IF
655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef GOOGLE_CHECK
657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef GOOGLE_CHECK_EQ
658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef GOOGLE_CHECK_NE
659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef GOOGLE_CHECK_LT
660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef GOOGLE_CHECK_LE
661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef GOOGLE_CHECK_GT
662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef GOOGLE_CHECK_GE
663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef GOOGLE_DLOG
665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef GOOGLE_DCHECK
666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef GOOGLE_DCHECK_EQ
667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef GOOGLE_DCHECK_NE
668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef GOOGLE_DCHECK_LT
669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef GOOGLE_DCHECK_LE
670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef GOOGLE_DCHECK_GT
671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef GOOGLE_DCHECK_GE
672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_LOG(LEVEL)                                                 \
674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ::google::protobuf::internal::LogFinisher() =                           \
675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ::google::protobuf::internal::LogMessage(                             \
676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ::google::protobuf::LOGLEVEL_##LEVEL, __FILE__, __LINE__)
677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_LOG_IF(LEVEL, CONDITION) \
678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  !(CONDITION) ? (void)0 : GOOGLE_LOG(LEVEL)
679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_CHECK(EXPRESSION) \
681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_LOG_IF(FATAL, !(EXPRESSION)) << "CHECK failed: " #EXPRESSION ": "
682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_CHECK_EQ(A, B) GOOGLE_CHECK((A) == (B))
683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_CHECK_NE(A, B) GOOGLE_CHECK((A) != (B))
684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_CHECK_LT(A, B) GOOGLE_CHECK((A) <  (B))
685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_CHECK_LE(A, B) GOOGLE_CHECK((A) <= (B))
686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_CHECK_GT(A, B) GOOGLE_CHECK((A) >  (B))
687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_CHECK_GE(A, B) GOOGLE_CHECK((A) >= (B))
688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifdef NDEBUG
690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_DLOG GOOGLE_LOG_IF(INFO, false)
692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_DCHECK(EXPRESSION) while(false) GOOGLE_CHECK(EXPRESSION)
694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_DCHECK_EQ(A, B) GOOGLE_DCHECK((A) == (B))
695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_DCHECK_NE(A, B) GOOGLE_DCHECK((A) != (B))
696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_DCHECK_LT(A, B) GOOGLE_DCHECK((A) <  (B))
697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_DCHECK_LE(A, B) GOOGLE_DCHECK((A) <= (B))
698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_DCHECK_GT(A, B) GOOGLE_DCHECK((A) >  (B))
699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_DCHECK_GE(A, B) GOOGLE_DCHECK((A) >= (B))
700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#else  // NDEBUG
702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_DLOG GOOGLE_LOG
704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_DCHECK    GOOGLE_CHECK
706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_DCHECK_EQ GOOGLE_CHECK_EQ
707fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_DCHECK_NE GOOGLE_CHECK_NE
708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_DCHECK_LT GOOGLE_CHECK_LT
709fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_DCHECK_LE GOOGLE_CHECK_LE
710fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_DCHECK_GT GOOGLE_CHECK_GT
711fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_DCHECK_GE GOOGLE_CHECK_GE
712fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif  // !NDEBUG
714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef void LogHandler(LogLevel level, const char* filename, int line,
716fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                        const string& message);
717fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
718fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The protobuf library sometimes writes warning and error messages to
719fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// stderr.  These messages are primarily useful for developers, but may
720fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// also help end users figure out a problem.  If you would prefer that
721fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// these messages be sent somewhere other than stderr, call SetLogHandler()
722fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// to set your own handler.  This returns the old handler.  Set the handler
723fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// to NULL to ignore log messages (but see also LogSilencer, below).
724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Obviously, SetLogHandler is not thread-safe.  You should only call it
726fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// at initialization time, and probably not from library code.  If you
727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// simply want to suppress log messages temporarily (e.g. because you
728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// have some code that tends to trigger them frequently and you know
729fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// the warnings are not important to you), use the LogSilencer class
730fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// below.
731fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleLIBPROTOBUF_EXPORT LogHandler* SetLogHandler(LogHandler* new_func);
732fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Create a LogSilencer if you want to temporarily suppress all log
734fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// messages.  As long as any LogSilencer objects exist, non-fatal
735fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// log messages will be discarded (the current LogHandler will *not*
736fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// be called).  Constructing a LogSilencer is thread-safe.  You may
737fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// accidentally suppress log messages occurring in another thread, but
738fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// since messages are generally for debugging purposes only, this isn't
739fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// a big deal.  If you want to intercept log messages, use SetLogHandler().
740fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT LogSilencer {
741fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
742fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  LogSilencer();
743fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ~LogSilencer();
744fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
745fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
746fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// emulates google3/base/callback.h
748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
749fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Abstract interface for a callback.  When calling an RPC, you must provide
750fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// a Closure to call when the procedure completes.  See the Service interface
751fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in service.h.
752fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
753fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// To automatically construct a Closure which calls a particular function or
754fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// method with a particular set of parameters, use the NewCallback() function.
755fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Example:
756fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   void FooDone(const FooResponse* response) {
757fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     ...
758fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   }
759fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
760fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   void CallFoo() {
761fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     ...
762fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     // When done, call FooDone() and pass it a pointer to the response.
763fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     Closure* callback = NewCallback(&FooDone, response);
764fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     // Make the call.
765fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     service->Foo(controller, request, response, callback);
766fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   }
767fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
768fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Example that calls a method:
769fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   class Handler {
770fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//    public:
771fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     ...
772fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
773fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     void FooDone(const FooResponse* response) {
774fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//       ...
775fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     }
776fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
777fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     void CallFoo() {
778fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//       ...
779fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//       // When done, call FooDone() and pass it a pointer to the response.
780fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//       Closure* callback = NewCallback(this, &Handler::FooDone, response);
781fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//       // Make the call.
782fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//       service->Foo(controller, request, response, callback);
783fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     }
784fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   };
785fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
786fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Currently NewCallback() supports binding zero, one, or two arguments.
787fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
788fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Callbacks created with NewCallback() automatically delete themselves when
789fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// executed.  They should be used when a callback is to be called exactly
790fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// once (usually the case with RPC callbacks).  If a callback may be called
791fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// a different number of times (including zero), create it with
792fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// NewPermanentCallback() instead.  You are then responsible for deleting the
793fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// callback (using the "delete" keyword as normal).
794fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Note that NewCallback() is a bit touchy regarding argument types.  Generally,
796fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// the values you provide for the parameter bindings must exactly match the
797fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// types accepted by the callback function.  For example:
798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   void Foo(string s);
799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   NewCallback(&Foo, "foo");          // WON'T WORK:  const char* != string
800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   NewCallback(&Foo, string("foo"));  // WORKS
801fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Also note that the arguments cannot be references:
802fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   void Foo(const string& s);
803fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   string my_str;
804fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   NewCallback(&Foo, my_str);  // WON'T WORK:  Can't use referecnes.
805fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// However, correctly-typed pointers will work just fine.
806fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT Closure {
807fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
808fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Closure() {}
809fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ~Closure();
810fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual void Run() = 0;
812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
814fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Closure);
815fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
816fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace internal {
818fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
819fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT FunctionClosure0 : public Closure {
820fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
821fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typedef void (*FunctionType)();
822fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
823fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  FunctionClosure0(FunctionType function, bool self_deleting)
824fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    : function_(function), self_deleting_(self_deleting) {}
825fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ~FunctionClosure0();
826fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
827fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void Run() {
828fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    function_();
829fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (self_deleting_) delete this;
830fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
831fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
832fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
833fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  FunctionType function_;
834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool self_deleting_;
835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
836fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
837fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Class>
838fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass MethodClosure0 : public Closure {
839fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
840fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typedef void (Class::*MethodType)();
841fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
842fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  MethodClosure0(Class* object, MethodType method, bool self_deleting)
843fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    : object_(object), method_(method), self_deleting_(self_deleting) {}
844fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ~MethodClosure0() {}
845fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
846fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void Run() {
847fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    (object_->*method_)();
848fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (self_deleting_) delete this;
849fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
850fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
851fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
852fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Class* object_;
853fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  MethodType method_;
854fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool self_deleting_;
855fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
856fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
857fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Arg1>
858fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass FunctionClosure1 : public Closure {
859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typedef void (*FunctionType)(Arg1 arg1);
861fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
862fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  FunctionClosure1(FunctionType function, bool self_deleting,
863fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                   Arg1 arg1)
864fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    : function_(function), self_deleting_(self_deleting),
865fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      arg1_(arg1) {}
866fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ~FunctionClosure1() {}
867fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
868fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void Run() {
869fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    function_(arg1_);
870fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (self_deleting_) delete this;
871fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
872fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
873fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
874fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  FunctionType function_;
875fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool self_deleting_;
876fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Arg1 arg1_;
877fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
878fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
879fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Class, typename Arg1>
880fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass MethodClosure1 : public Closure {
881fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
882fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typedef void (Class::*MethodType)(Arg1 arg1);
883fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
884fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  MethodClosure1(Class* object, MethodType method, bool self_deleting,
885fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 Arg1 arg1)
886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    : object_(object), method_(method), self_deleting_(self_deleting),
887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      arg1_(arg1) {}
888fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ~MethodClosure1() {}
889fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
890fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void Run() {
891fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    (object_->*method_)(arg1_);
892fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (self_deleting_) delete this;
893fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
894fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
895fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
896fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Class* object_;
897fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  MethodType method_;
898fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool self_deleting_;
899fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Arg1 arg1_;
900fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
901fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
902fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Arg1, typename Arg2>
903fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass FunctionClosure2 : public Closure {
904fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
905fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typedef void (*FunctionType)(Arg1 arg1, Arg2 arg2);
906fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
907fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  FunctionClosure2(FunctionType function, bool self_deleting,
908fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                   Arg1 arg1, Arg2 arg2)
909fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    : function_(function), self_deleting_(self_deleting),
910fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      arg1_(arg1), arg2_(arg2) {}
911fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ~FunctionClosure2() {}
912fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
913fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void Run() {
914fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    function_(arg1_, arg2_);
915fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (self_deleting_) delete this;
916fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
917fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
918fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
919fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  FunctionType function_;
920fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool self_deleting_;
921fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Arg1 arg1_;
922fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Arg2 arg2_;
923fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
924fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
925fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Class, typename Arg1, typename Arg2>
926fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass MethodClosure2 : public Closure {
927fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
928fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typedef void (Class::*MethodType)(Arg1 arg1, Arg2 arg2);
929fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
930fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  MethodClosure2(Class* object, MethodType method, bool self_deleting,
931fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 Arg1 arg1, Arg2 arg2)
932fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    : object_(object), method_(method), self_deleting_(self_deleting),
933fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      arg1_(arg1), arg2_(arg2) {}
934fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ~MethodClosure2() {}
935fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
936fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void Run() {
937fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    (object_->*method_)(arg1_, arg2_);
938fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (self_deleting_) delete this;
939fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
940fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
941fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
942fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Class* object_;
943fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  MethodType method_;
944fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool self_deleting_;
945fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Arg1 arg1_;
946fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Arg2 arg2_;
947fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
948fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
949fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace internal
950fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
951fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// See Closure.
952fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline Closure* NewCallback(void (*function)()) {
953fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return new internal::FunctionClosure0(function, true);
954fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
955fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
956fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// See Closure.
957fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline Closure* NewPermanentCallback(void (*function)()) {
958fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return new internal::FunctionClosure0(function, false);
959fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
960fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
961fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// See Closure.
962fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Class>
963fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline Closure* NewCallback(Class* object, void (Class::*method)()) {
964fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return new internal::MethodClosure0<Class>(object, method, true);
965fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
966fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
967fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// See Closure.
968fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Class>
969fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline Closure* NewPermanentCallback(Class* object, void (Class::*method)()) {
970fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return new internal::MethodClosure0<Class>(object, method, false);
971fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
972fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
973fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// See Closure.
974fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Arg1>
975fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline Closure* NewCallback(void (*function)(Arg1),
976fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                            Arg1 arg1) {
977fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return new internal::FunctionClosure1<Arg1>(function, true, arg1);
978fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
979fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
980fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// See Closure.
981fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Arg1>
982fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline Closure* NewPermanentCallback(void (*function)(Arg1),
983fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                     Arg1 arg1) {
984fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return new internal::FunctionClosure1<Arg1>(function, false, arg1);
985fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
986fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
987fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// See Closure.
988fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Class, typename Arg1>
989fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline Closure* NewCallback(Class* object, void (Class::*method)(Arg1),
990fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                            Arg1 arg1) {
991fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return new internal::MethodClosure1<Class, Arg1>(object, method, true, arg1);
992fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
993fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
994fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// See Closure.
995fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Class, typename Arg1>
996fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline Closure* NewPermanentCallback(Class* object, void (Class::*method)(Arg1),
997fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                     Arg1 arg1) {
998fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return new internal::MethodClosure1<Class, Arg1>(object, method, false, arg1);
999fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1000fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1001fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// See Closure.
1002fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Arg1, typename Arg2>
1003fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline Closure* NewCallback(void (*function)(Arg1, Arg2),
1004fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                            Arg1 arg1, Arg2 arg2) {
1005fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return new internal::FunctionClosure2<Arg1, Arg2>(
1006fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    function, true, arg1, arg2);
1007fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1008fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1009fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// See Closure.
1010fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Arg1, typename Arg2>
1011fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline Closure* NewPermanentCallback(void (*function)(Arg1, Arg2),
1012fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                     Arg1 arg1, Arg2 arg2) {
1013fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return new internal::FunctionClosure2<Arg1, Arg2>(
1014fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    function, false, arg1, arg2);
1015fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1016fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1017fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// See Closure.
1018fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Class, typename Arg1, typename Arg2>
1019fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline Closure* NewCallback(Class* object, void (Class::*method)(Arg1, Arg2),
1020fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                            Arg1 arg1, Arg2 arg2) {
1021fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return new internal::MethodClosure2<Class, Arg1, Arg2>(
1022fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    object, method, true, arg1, arg2);
1023fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1024fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1025fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// See Closure.
1026fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Class, typename Arg1, typename Arg2>
1027fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline Closure* NewPermanentCallback(
1028fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Class* object, void (Class::*method)(Arg1, Arg2),
1029fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Arg1 arg1, Arg2 arg2) {
1030fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return new internal::MethodClosure2<Class, Arg1, Arg2>(
1031fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    object, method, false, arg1, arg2);
1032fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1033fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1034fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A function which does nothing.  Useful for creating no-op callbacks, e.g.:
1035fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   Closure* nothing = NewCallback(&DoNothing);
1036fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid LIBPROTOBUF_EXPORT DoNothing();
1037fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1038fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
1039fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// emulates google3/base/mutex.h
1040fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1041fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace internal {
1042fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1043fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A Mutex is a non-reentrant (aka non-recursive) mutex.  At most one thread T
1044fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// may hold a mutex at a given time.  If T attempts to Lock() the same Mutex
1045fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// while holding it, T will deadlock.
1046fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT Mutex {
1047fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
1048fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Create a Mutex that is not held by anybody.
1049fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Mutex();
1050fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1051fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Destructor
1052fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ~Mutex();
1053fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1054fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Block if necessary until this Mutex is free, then acquire it exclusively.
1055fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void Lock();
1056fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1057fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Release this Mutex.  Caller must hold it exclusively.
1058fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void Unlock();
1059fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1060fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Crash if this Mutex is not held exclusively by this thread.
1061fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // May fail to crash when it should; will never crash when it should not.
1062fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void AssertHeld();
1063fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1064fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
1065fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  struct Internal;
1066fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Internal* mInternal;
1067fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1068fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Mutex);
1069fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
1070fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1071fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// MutexLock(mu) acquires mu when constructed and releases it when destroyed.
1072fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT MutexLock {
1073fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
1074fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  explicit MutexLock(Mutex *mu) : mu_(mu) { this->mu_->Lock(); }
1075fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ~MutexLock() { this->mu_->Unlock(); }
1076fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
1077fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Mutex *const mu_;
1078fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MutexLock);
1079fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
1080fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1081fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// TODO(kenton):  Implement these?  Hard to implement portably.
1082fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef MutexLock ReaderMutexLock;
1083fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef MutexLock WriterMutexLock;
1084fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1085fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// MutexLockMaybe is like MutexLock, but is a no-op when mu is NULL.
1086fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT MutexLockMaybe {
1087fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
1088fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  explicit MutexLockMaybe(Mutex *mu) :
1089fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    mu_(mu) { if (this->mu_ != NULL) { this->mu_->Lock(); } }
1090fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ~MutexLockMaybe() { if (this->mu_ != NULL) { this->mu_->Unlock(); } }
1091fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
1092fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Mutex *const mu_;
1093fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MutexLockMaybe);
1094fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
1095fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1096fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace internal
1097fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1098fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// We made these internal so that they would show up as such in the docs,
1099fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// but we don't want to stick "internal::" in front of them everywhere.
1100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing internal::Mutex;
1101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing internal::MutexLock;
1102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing internal::ReaderMutexLock;
1103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing internal::WriterMutexLock;
1104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing internal::MutexLockMaybe;
1105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
1107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// from google3/base/type_traits.h
1108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace internal {
1110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Specified by TR1 [4.7.4] Pointer modifications.
1112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate<typename T> struct remove_pointer { typedef T type; };
1113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate<typename T> struct remove_pointer<T*> { typedef T type; };
1114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate<typename T> struct remove_pointer<T* const> { typedef T type; };
1115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate<typename T> struct remove_pointer<T* volatile> { typedef T type; };
1116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate<typename T> struct remove_pointer<T* const volatile> {
1117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typedef T type; };
1118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
1120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Checks if the buffer contains structurally-valid UTF-8.  Implemented in
1122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// structurally_valid.cc.
1123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleLIBPROTOBUF_EXPORT bool IsStructurallyValidUTF8(const char* buf, int len);
1124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace internal
1126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
1128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Shutdown support.
1129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Shut down the entire protocol buffers library, deleting all static-duration
1131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// objects allocated by the library or by generated .pb.cc files.
1132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
1133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// There are two reasons you might want to call this:
1134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * You use a draconian definition of "memory leak" in which you expect
1135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   every single malloc() to have a corresponding free(), even for objects
1136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   which live until program exit.
1137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * You are writing a dynamically-loaded library which needs to clean up
1138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   after itself when the library is unloaded.
1139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
1140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// It is safe to call this multiple times.  However, it is not safe to use
1141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// any other part of the protocol buffers library after
1142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ShutdownProtobufLibrary() has been called.
1143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleLIBPROTOBUF_EXPORT void ShutdownProtobufLibrary();
1144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace internal {
1146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Register a function to be called when ShutdownProtocolBuffers() is called.
1148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleLIBPROTOBUF_EXPORT void OnShutdown(void (*func)());
1149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace internal
1151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace protobuf
1153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace google
1154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif  // GOOGLE_PROTOBUF_COMMON_H__
1156