explicitly_constructed.h
Go to the documentation of this file.
1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc. All rights reserved.
3 // https://developers.google.com/protocol-buffers/
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are
7 // met:
8 //
9 // * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer.
11 // * Redistributions in binary form must reproduce the above
12 // copyright notice, this list of conditions and the following disclaimer
13 // in the documentation and/or other materials provided with the
14 // distribution.
15 // * Neither the name of Google Inc. nor the names of its
16 // contributors may be used to endorse or promote products derived from
17 // this software without specific prior written permission.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 
31 #ifndef GOOGLE_PROTOBUF_EXPLICITLY_CONSTRUCTED_H__
32 #define GOOGLE_PROTOBUF_EXPLICITLY_CONSTRUCTED_H__
33 
34 #include <stdint.h>
35 
36 #include <utility>
37 
38 #include <google/protobuf/stubs/logging.h>
39 #include <google/protobuf/stubs/common.h>
40 
41 // clang-format off
42 #include <google/protobuf/port_def.inc>
43 // clang-format on
44 
45 namespace google {
46 namespace protobuf {
47 namespace internal {
48 
49 // Wraps a variable whose constructor and destructor are explicitly
50 // called. It is particularly useful for a global variable, without its
51 // constructor and destructor run on start and end of the program lifetime.
52 // This circumvents the initial construction order fiasco, while keeping
53 // the address of the empty string a compile time constant.
54 //
55 // Pay special attention to the initialization state of the object.
56 // 1. The object is "uninitialized" to begin with.
57 // 2. Call Construct() or DefaultConstruct() only if the object is
58 // uninitialized. After the call, the object becomes "initialized".
59 // 3. Call get() and get_mutable() only if the object is initialized.
60 // 4. Call Destruct() only if the object is initialized.
61 // After the call, the object becomes uninitialized.
62 template <typename T>
63 class ExplicitlyConstructed {
64  public:
65  void DefaultConstruct() { new (&union_) T(); }
66 
67  template <typename... Args>
68  void Construct(Args&&... args) {
69  new (&union_) T(std::forward<Args>(args)...);
70  }
71 
72  void Destruct() { get_mutable()->~T(); }
73 
74  constexpr const T& get() const { return reinterpret_cast<const T&>(union_); }
75  T* get_mutable() { return reinterpret_cast<T*>(&union_); }
76 
77  private:
78  union AlignedUnion {
79  alignas(T) char space[sizeof(T)];
81  void* align_to_ptr;
82  } union_;
83 };
84 
85 } // namespace internal
86 } // namespace protobuf
87 } // namespace google
88 
89 #include <google/protobuf/port_undef.inc>
90 
91 #endif // GOOGLE_PROTOBUF_EXPLICITLY_CONSTRUCTED_H__
google::protobuf
Definition: bloaty/third_party/protobuf/benchmarks/util/data_proto2_to_proto3_util.h:12
T
#define T(upbtypeconst, upbtype, ctype, default_value)
google::protobuf.internal::ExplicitlyConstructed::get
constexpr const T & get() const
Definition: explicitly_constructed.h:74
google::protobuf.internal::ExplicitlyConstructed::get_mutable
T * get_mutable()
Definition: bloaty/third_party/protobuf/src/google/protobuf/message_lite.h:136
asyncio_get_stats.args
args
Definition: asyncio_get_stats.py:40
hpack_encoder_fixtures::Args
Args({0, 16384})
int64_t
signed __int64 int64_t
Definition: stdint-msvc2008.h:89
google::protobuf.internal::ExplicitlyConstructed::AlignedUnion::align_to_ptr
void * align_to_ptr
Definition: bloaty/third_party/protobuf/src/google/protobuf/message_lite.h:143
google::protobuf.internal::ExplicitlyConstructed::Construct
void Construct(Args &&... args)
Definition: explicitly_constructed.h:68
stdint.h
google::protobuf.internal::ExplicitlyConstructed::DefaultConstruct
void DefaultConstruct()
Definition: explicitly_constructed.h:65
google::protobuf.internal::ExplicitlyConstructed::AlignedUnion::space
char space[sizeof(T)]
Definition: bloaty/third_party/protobuf/src/google/protobuf/message_lite.h:141
google::protobuf.internal::ExplicitlyConstructed::Destruct
void Destruct()
Definition: explicitly_constructed.h:72
internal
Definition: benchmark/test/output_test_helper.cc:20
google::protobuf.internal::ExplicitlyConstructed::AlignedUnion::align_to_int64
int64_t align_to_int64
Definition: explicitly_constructed.h:80
google
Definition: bloaty/third_party/protobuf/benchmarks/util/data_proto2_to_proto3_util.h:11
google::protobuf.internal::ExplicitlyConstructed::union_
union google::protobuf::internal::ExplicitlyConstructed::AlignedUnion union_


grpc
Author(s):
autogenerated on Thu Mar 13 2025 02:59:17