诸暨麻将添加redis
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

2147 regels
82 KiB

  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. // Author: kenton@google.com (Kenton Varda)
  31. // Based on original Protocol Buffers design by
  32. // Sanjay Ghemawat, Jeff Dean, and others.
  33. #include <google/protobuf/extension_set.h>
  34. #include <tuple>
  35. #include <unordered_map>
  36. #include <utility>
  37. #include <google/protobuf/stubs/common.h>
  38. #include <google/protobuf/extension_set_inl.h>
  39. #include <google/protobuf/parse_context.h>
  40. #include <google/protobuf/io/coded_stream.h>
  41. #include <google/protobuf/io/zero_copy_stream_impl_lite.h>
  42. #include <google/protobuf/message_lite.h>
  43. #include <google/protobuf/metadata_lite.h>
  44. #include <google/protobuf/repeated_field.h>
  45. #include <google/protobuf/stubs/map_util.h>
  46. #include <google/protobuf/stubs/hash.h>
  47. #include <google/protobuf/port_def.inc>
  48. namespace google {
  49. namespace protobuf {
  50. namespace internal {
  51. namespace {
  52. inline WireFormatLite::FieldType real_type(FieldType type) {
  53. GOOGLE_DCHECK(type > 0 && type <= WireFormatLite::MAX_FIELD_TYPE);
  54. return static_cast<WireFormatLite::FieldType>(type);
  55. }
  56. inline WireFormatLite::CppType cpp_type(FieldType type) {
  57. return WireFormatLite::FieldTypeToCppType(real_type(type));
  58. }
  59. inline bool is_packable(WireFormatLite::WireType type) {
  60. switch (type) {
  61. case WireFormatLite::WIRETYPE_VARINT:
  62. case WireFormatLite::WIRETYPE_FIXED64:
  63. case WireFormatLite::WIRETYPE_FIXED32:
  64. return true;
  65. case WireFormatLite::WIRETYPE_LENGTH_DELIMITED:
  66. case WireFormatLite::WIRETYPE_START_GROUP:
  67. case WireFormatLite::WIRETYPE_END_GROUP:
  68. return false;
  69. // Do not add a default statement. Let the compiler complain when someone
  70. // adds a new wire type.
  71. }
  72. GOOGLE_LOG(FATAL) << "can't reach here.";
  73. return false;
  74. }
  75. // Registry stuff.
  76. struct ExtensionHasher {
  77. std::size_t operator()(const std::pair<const MessageLite*, int>& p) const {
  78. return std::hash<const MessageLite*>{}(p.first) ^
  79. std::hash<int>{}(p.second);
  80. }
  81. };
  82. typedef std::unordered_map<std::pair<const MessageLite*, int>, ExtensionInfo,
  83. ExtensionHasher>
  84. ExtensionRegistry;
  85. static const ExtensionRegistry* global_registry = nullptr;
  86. // This function is only called at startup, so there is no need for thread-
  87. // safety.
  88. void Register(const MessageLite* containing_type, int number,
  89. ExtensionInfo info) {
  90. static auto local_static_registry = OnShutdownDelete(new ExtensionRegistry);
  91. global_registry = local_static_registry;
  92. if (!InsertIfNotPresent(local_static_registry,
  93. std::make_pair(containing_type, number), info)) {
  94. GOOGLE_LOG(FATAL) << "Multiple extension registrations for type \""
  95. << containing_type->GetTypeName() << "\", field number "
  96. << number << ".";
  97. }
  98. }
  99. const ExtensionInfo* FindRegisteredExtension(const MessageLite* containing_type,
  100. int number) {
  101. return global_registry == nullptr
  102. ? nullptr
  103. : FindOrNull(*global_registry,
  104. std::make_pair(containing_type, number));
  105. }
  106. } // namespace
  107. ExtensionFinder::~ExtensionFinder() {}
  108. bool GeneratedExtensionFinder::Find(int number, ExtensionInfo* output) {
  109. const ExtensionInfo* extension =
  110. FindRegisteredExtension(containing_type_, number);
  111. if (extension == NULL) {
  112. return false;
  113. } else {
  114. *output = *extension;
  115. return true;
  116. }
  117. }
  118. void ExtensionSet::RegisterExtension(const MessageLite* containing_type,
  119. int number, FieldType type,
  120. bool is_repeated, bool is_packed) {
  121. GOOGLE_CHECK_NE(type, WireFormatLite::TYPE_ENUM);
  122. GOOGLE_CHECK_NE(type, WireFormatLite::TYPE_MESSAGE);
  123. GOOGLE_CHECK_NE(type, WireFormatLite::TYPE_GROUP);
  124. ExtensionInfo info(type, is_repeated, is_packed);
  125. Register(containing_type, number, info);
  126. }
  127. static bool CallNoArgValidityFunc(const void* arg, int number) {
  128. // Note: Must use C-style cast here rather than reinterpret_cast because
  129. // the C++ standard at one point did not allow casts between function and
  130. // data pointers and some compilers enforce this for C++-style casts. No
  131. // compiler enforces it for C-style casts since lots of C-style code has
  132. // relied on these kinds of casts for a long time, despite being
  133. // technically undefined. See:
  134. // http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#195
  135. // Also note: Some compilers do not allow function pointers to be "const".
  136. // Which makes sense, I suppose, because it's meaningless.
  137. return ((EnumValidityFunc*)arg)(number);
  138. }
  139. void ExtensionSet::RegisterEnumExtension(const MessageLite* containing_type,
  140. int number, FieldType type,
  141. bool is_repeated, bool is_packed,
  142. EnumValidityFunc* is_valid) {
  143. GOOGLE_CHECK_EQ(type, WireFormatLite::TYPE_ENUM);
  144. ExtensionInfo info(type, is_repeated, is_packed);
  145. info.enum_validity_check.func = CallNoArgValidityFunc;
  146. // See comment in CallNoArgValidityFunc() about why we use a c-style cast.
  147. info.enum_validity_check.arg = (void*)is_valid;
  148. Register(containing_type, number, info);
  149. }
  150. void ExtensionSet::RegisterMessageExtension(const MessageLite* containing_type,
  151. int number, FieldType type,
  152. bool is_repeated, bool is_packed,
  153. const MessageLite* prototype) {
  154. GOOGLE_CHECK(type == WireFormatLite::TYPE_MESSAGE ||
  155. type == WireFormatLite::TYPE_GROUP);
  156. ExtensionInfo info(type, is_repeated, is_packed);
  157. info.message_info = {prototype};
  158. Register(containing_type, number, info);
  159. }
  160. // ===================================================================
  161. // Constructors and basic methods.
  162. ExtensionSet::ExtensionSet(Arena* arena)
  163. : arena_(arena),
  164. flat_capacity_(0),
  165. flat_size_(0),
  166. map_{flat_capacity_ == 0
  167. ? NULL
  168. : Arena::CreateArray<KeyValue>(arena_, flat_capacity_)} {}
  169. ExtensionSet::ExtensionSet()
  170. : arena_(NULL),
  171. flat_capacity_(0),
  172. flat_size_(0),
  173. map_{flat_capacity_ == 0
  174. ? NULL
  175. : Arena::CreateArray<KeyValue>(arena_, flat_capacity_)} {}
  176. ExtensionSet::~ExtensionSet() {
  177. // Deletes all allocated extensions.
  178. if (arena_ == NULL) {
  179. ForEach([](int /* number */, Extension& ext) { ext.Free(); });
  180. if (PROTOBUF_PREDICT_FALSE(is_large())) {
  181. delete map_.large;
  182. } else {
  183. DeleteFlatMap(map_.flat, flat_capacity_);
  184. }
  185. }
  186. }
  187. void ExtensionSet::DeleteFlatMap(const ExtensionSet::KeyValue* flat,
  188. uint16 flat_capacity) {
  189. #ifdef __cpp_sized_deallocation
  190. // Arena::CreateArray already requires a trivially destructible type, but
  191. // ensure this constraint is not violated in the future.
  192. static_assert(std::is_trivially_destructible<KeyValue>::value,
  193. "CreateArray requires a trivially destructible type");
  194. // A const-cast is needed, but this is safe as we are about to deallocate the
  195. // array.
  196. ::operator delete[](const_cast<ExtensionSet::KeyValue*>(flat),
  197. sizeof(*flat) * flat_capacity);
  198. #else // !__cpp_sized_deallocation
  199. delete[] flat;
  200. #endif // !__cpp_sized_deallocation
  201. }
  202. // Defined in extension_set_heavy.cc.
  203. // void ExtensionSet::AppendToList(const Descriptor* containing_type,
  204. // const DescriptorPool* pool,
  205. // vector<const FieldDescriptor*>* output) const
  206. bool ExtensionSet::Has(int number) const {
  207. const Extension* ext = FindOrNull(number);
  208. if (ext == NULL) return false;
  209. GOOGLE_DCHECK(!ext->is_repeated);
  210. return !ext->is_cleared;
  211. }
  212. int ExtensionSet::NumExtensions() const {
  213. int result = 0;
  214. ForEach([&result](int /* number */, const Extension& ext) {
  215. if (!ext.is_cleared) {
  216. ++result;
  217. }
  218. });
  219. return result;
  220. }
  221. int ExtensionSet::ExtensionSize(int number) const {
  222. const Extension* ext = FindOrNull(number);
  223. return ext == NULL ? 0 : ext->GetSize();
  224. }
  225. FieldType ExtensionSet::ExtensionType(int number) const {
  226. const Extension* ext = FindOrNull(number);
  227. if (ext == NULL) {
  228. GOOGLE_LOG(DFATAL) << "Don't lookup extension types if they aren't present (1). ";
  229. return 0;
  230. }
  231. if (ext->is_cleared) {
  232. GOOGLE_LOG(DFATAL) << "Don't lookup extension types if they aren't present (2). ";
  233. }
  234. return ext->type;
  235. }
  236. void ExtensionSet::ClearExtension(int number) {
  237. Extension* ext = FindOrNull(number);
  238. if (ext == NULL) return;
  239. ext->Clear();
  240. }
  241. // ===================================================================
  242. // Field accessors
  243. namespace {
  244. enum { REPEATED_FIELD, OPTIONAL_FIELD };
  245. } // namespace
  246. #define GOOGLE_DCHECK_TYPE(EXTENSION, LABEL, CPPTYPE) \
  247. GOOGLE_DCHECK_EQ((EXTENSION).is_repeated ? REPEATED_FIELD : OPTIONAL_FIELD, LABEL); \
  248. GOOGLE_DCHECK_EQ(cpp_type((EXTENSION).type), WireFormatLite::CPPTYPE_##CPPTYPE)
  249. // -------------------------------------------------------------------
  250. // Primitives
  251. #define PRIMITIVE_ACCESSORS(UPPERCASE, LOWERCASE, CAMELCASE) \
  252. \
  253. LOWERCASE ExtensionSet::Get##CAMELCASE(int number, LOWERCASE default_value) \
  254. const { \
  255. const Extension* extension = FindOrNull(number); \
  256. if (extension == NULL || extension->is_cleared) { \
  257. return default_value; \
  258. } else { \
  259. GOOGLE_DCHECK_TYPE(*extension, OPTIONAL_FIELD, UPPERCASE); \
  260. return extension->LOWERCASE##_value; \
  261. } \
  262. } \
  263. \
  264. void ExtensionSet::Set##CAMELCASE(int number, FieldType type, \
  265. LOWERCASE value, \
  266. const FieldDescriptor* descriptor) { \
  267. Extension* extension; \
  268. if (MaybeNewExtension(number, descriptor, &extension)) { \
  269. extension->type = type; \
  270. GOOGLE_DCHECK_EQ(cpp_type(extension->type), \
  271. WireFormatLite::CPPTYPE_##UPPERCASE); \
  272. extension->is_repeated = false; \
  273. } else { \
  274. GOOGLE_DCHECK_TYPE(*extension, OPTIONAL_FIELD, UPPERCASE); \
  275. } \
  276. extension->is_cleared = false; \
  277. extension->LOWERCASE##_value = value; \
  278. } \
  279. \
  280. LOWERCASE ExtensionSet::GetRepeated##CAMELCASE(int number, int index) \
  281. const { \
  282. const Extension* extension = FindOrNull(number); \
  283. GOOGLE_CHECK(extension != NULL) << "Index out-of-bounds (field is empty)."; \
  284. GOOGLE_DCHECK_TYPE(*extension, REPEATED_FIELD, UPPERCASE); \
  285. return extension->repeated_##LOWERCASE##_value->Get(index); \
  286. } \
  287. \
  288. void ExtensionSet::SetRepeated##CAMELCASE(int number, int index, \
  289. LOWERCASE value) { \
  290. Extension* extension = FindOrNull(number); \
  291. GOOGLE_CHECK(extension != NULL) << "Index out-of-bounds (field is empty)."; \
  292. GOOGLE_DCHECK_TYPE(*extension, REPEATED_FIELD, UPPERCASE); \
  293. extension->repeated_##LOWERCASE##_value->Set(index, value); \
  294. } \
  295. \
  296. void ExtensionSet::Add##CAMELCASE(int number, FieldType type, bool packed, \
  297. LOWERCASE value, \
  298. const FieldDescriptor* descriptor) { \
  299. Extension* extension; \
  300. if (MaybeNewExtension(number, descriptor, &extension)) { \
  301. extension->type = type; \
  302. GOOGLE_DCHECK_EQ(cpp_type(extension->type), \
  303. WireFormatLite::CPPTYPE_##UPPERCASE); \
  304. extension->is_repeated = true; \
  305. extension->is_packed = packed; \
  306. extension->repeated_##LOWERCASE##_value = \
  307. Arena::CreateMessage<RepeatedField<LOWERCASE>>(arena_); \
  308. } else { \
  309. GOOGLE_DCHECK_TYPE(*extension, REPEATED_FIELD, UPPERCASE); \
  310. GOOGLE_DCHECK_EQ(extension->is_packed, packed); \
  311. } \
  312. extension->repeated_##LOWERCASE##_value->Add(value); \
  313. }
  314. PRIMITIVE_ACCESSORS(INT32, int32, Int32)
  315. PRIMITIVE_ACCESSORS(INT64, int64, Int64)
  316. PRIMITIVE_ACCESSORS(UINT32, uint32, UInt32)
  317. PRIMITIVE_ACCESSORS(UINT64, uint64, UInt64)
  318. PRIMITIVE_ACCESSORS(FLOAT, float, Float)
  319. PRIMITIVE_ACCESSORS(DOUBLE, double, Double)
  320. PRIMITIVE_ACCESSORS(BOOL, bool, Bool)
  321. #undef PRIMITIVE_ACCESSORS
  322. const void* ExtensionSet::GetRawRepeatedField(int number,
  323. const void* default_value) const {
  324. const Extension* extension = FindOrNull(number);
  325. if (extension == NULL) {
  326. return default_value;
  327. }
  328. // We assume that all the RepeatedField<>* pointers have the same
  329. // size and alignment within the anonymous union in Extension.
  330. return extension->repeated_int32_value;
  331. }
  332. void* ExtensionSet::MutableRawRepeatedField(int number, FieldType field_type,
  333. bool packed,
  334. const FieldDescriptor* desc) {
  335. Extension* extension;
  336. // We instantiate an empty Repeated{,Ptr}Field if one doesn't exist for this
  337. // extension.
  338. if (MaybeNewExtension(number, desc, &extension)) {
  339. extension->is_repeated = true;
  340. extension->type = field_type;
  341. extension->is_packed = packed;
  342. switch (WireFormatLite::FieldTypeToCppType(
  343. static_cast<WireFormatLite::FieldType>(field_type))) {
  344. case WireFormatLite::CPPTYPE_INT32:
  345. extension->repeated_int32_value =
  346. Arena::CreateMessage<RepeatedField<int32>>(arena_);
  347. break;
  348. case WireFormatLite::CPPTYPE_INT64:
  349. extension->repeated_int64_value =
  350. Arena::CreateMessage<RepeatedField<int64>>(arena_);
  351. break;
  352. case WireFormatLite::CPPTYPE_UINT32:
  353. extension->repeated_uint32_value =
  354. Arena::CreateMessage<RepeatedField<uint32>>(arena_);
  355. break;
  356. case WireFormatLite::CPPTYPE_UINT64:
  357. extension->repeated_uint64_value =
  358. Arena::CreateMessage<RepeatedField<uint64>>(arena_);
  359. break;
  360. case WireFormatLite::CPPTYPE_DOUBLE:
  361. extension->repeated_double_value =
  362. Arena::CreateMessage<RepeatedField<double>>(arena_);
  363. break;
  364. case WireFormatLite::CPPTYPE_FLOAT:
  365. extension->repeated_float_value =
  366. Arena::CreateMessage<RepeatedField<float>>(arena_);
  367. break;
  368. case WireFormatLite::CPPTYPE_BOOL:
  369. extension->repeated_bool_value =
  370. Arena::CreateMessage<RepeatedField<bool>>(arena_);
  371. break;
  372. case WireFormatLite::CPPTYPE_ENUM:
  373. extension->repeated_enum_value =
  374. Arena::CreateMessage<RepeatedField<int>>(arena_);
  375. break;
  376. case WireFormatLite::CPPTYPE_STRING:
  377. extension->repeated_string_value =
  378. Arena::CreateMessage<RepeatedPtrField<std::string>>(arena_);
  379. break;
  380. case WireFormatLite::CPPTYPE_MESSAGE:
  381. extension->repeated_message_value =
  382. Arena::CreateMessage<RepeatedPtrField<MessageLite>>(arena_);
  383. break;
  384. }
  385. }
  386. // We assume that all the RepeatedField<>* pointers have the same
  387. // size and alignment within the anonymous union in Extension.
  388. return extension->repeated_int32_value;
  389. }
  390. // Compatible version using old call signature. Does not create extensions when
  391. // the don't already exist; instead, just GOOGLE_CHECK-fails.
  392. void* ExtensionSet::MutableRawRepeatedField(int number) {
  393. Extension* extension = FindOrNull(number);
  394. GOOGLE_CHECK(extension != NULL) << "Extension not found.";
  395. // We assume that all the RepeatedField<>* pointers have the same
  396. // size and alignment within the anonymous union in Extension.
  397. return extension->repeated_int32_value;
  398. }
  399. // -------------------------------------------------------------------
  400. // Enums
  401. int ExtensionSet::GetEnum(int number, int default_value) const {
  402. const Extension* extension = FindOrNull(number);
  403. if (extension == NULL || extension->is_cleared) {
  404. // Not present. Return the default value.
  405. return default_value;
  406. } else {
  407. GOOGLE_DCHECK_TYPE(*extension, OPTIONAL_FIELD, ENUM);
  408. return extension->enum_value;
  409. }
  410. }
  411. void ExtensionSet::SetEnum(int number, FieldType type, int value,
  412. const FieldDescriptor* descriptor) {
  413. Extension* extension;
  414. if (MaybeNewExtension(number, descriptor, &extension)) {
  415. extension->type = type;
  416. GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_ENUM);
  417. extension->is_repeated = false;
  418. } else {
  419. GOOGLE_DCHECK_TYPE(*extension, OPTIONAL_FIELD, ENUM);
  420. }
  421. extension->is_cleared = false;
  422. extension->enum_value = value;
  423. }
  424. int ExtensionSet::GetRepeatedEnum(int number, int index) const {
  425. const Extension* extension = FindOrNull(number);
  426. GOOGLE_CHECK(extension != NULL) << "Index out-of-bounds (field is empty).";
  427. GOOGLE_DCHECK_TYPE(*extension, REPEATED_FIELD, ENUM);
  428. return extension->repeated_enum_value->Get(index);
  429. }
  430. void ExtensionSet::SetRepeatedEnum(int number, int index, int value) {
  431. Extension* extension = FindOrNull(number);
  432. GOOGLE_CHECK(extension != NULL) << "Index out-of-bounds (field is empty).";
  433. GOOGLE_DCHECK_TYPE(*extension, REPEATED_FIELD, ENUM);
  434. extension->repeated_enum_value->Set(index, value);
  435. }
  436. void ExtensionSet::AddEnum(int number, FieldType type, bool packed, int value,
  437. const FieldDescriptor* descriptor) {
  438. Extension* extension;
  439. if (MaybeNewExtension(number, descriptor, &extension)) {
  440. extension->type = type;
  441. GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_ENUM);
  442. extension->is_repeated = true;
  443. extension->is_packed = packed;
  444. extension->repeated_enum_value =
  445. Arena::CreateMessage<RepeatedField<int>>(arena_);
  446. } else {
  447. GOOGLE_DCHECK_TYPE(*extension, REPEATED_FIELD, ENUM);
  448. GOOGLE_DCHECK_EQ(extension->is_packed, packed);
  449. }
  450. extension->repeated_enum_value->Add(value);
  451. }
  452. // -------------------------------------------------------------------
  453. // Strings
  454. const std::string& ExtensionSet::GetString(
  455. int number, const std::string& default_value) const {
  456. const Extension* extension = FindOrNull(number);
  457. if (extension == NULL || extension->is_cleared) {
  458. // Not present. Return the default value.
  459. return default_value;
  460. } else {
  461. GOOGLE_DCHECK_TYPE(*extension, OPTIONAL_FIELD, STRING);
  462. return *extension->string_value;
  463. }
  464. }
  465. std::string* ExtensionSet::MutableString(int number, FieldType type,
  466. const FieldDescriptor* descriptor) {
  467. Extension* extension;
  468. if (MaybeNewExtension(number, descriptor, &extension)) {
  469. extension->type = type;
  470. GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_STRING);
  471. extension->is_repeated = false;
  472. extension->string_value = Arena::Create<std::string>(arena_);
  473. } else {
  474. GOOGLE_DCHECK_TYPE(*extension, OPTIONAL_FIELD, STRING);
  475. }
  476. extension->is_cleared = false;
  477. return extension->string_value;
  478. }
  479. const std::string& ExtensionSet::GetRepeatedString(int number,
  480. int index) const {
  481. const Extension* extension = FindOrNull(number);
  482. GOOGLE_CHECK(extension != NULL) << "Index out-of-bounds (field is empty).";
  483. GOOGLE_DCHECK_TYPE(*extension, REPEATED_FIELD, STRING);
  484. return extension->repeated_string_value->Get(index);
  485. }
  486. std::string* ExtensionSet::MutableRepeatedString(int number, int index) {
  487. Extension* extension = FindOrNull(number);
  488. GOOGLE_CHECK(extension != NULL) << "Index out-of-bounds (field is empty).";
  489. GOOGLE_DCHECK_TYPE(*extension, REPEATED_FIELD, STRING);
  490. return extension->repeated_string_value->Mutable(index);
  491. }
  492. std::string* ExtensionSet::AddString(int number, FieldType type,
  493. const FieldDescriptor* descriptor) {
  494. Extension* extension;
  495. if (MaybeNewExtension(number, descriptor, &extension)) {
  496. extension->type = type;
  497. GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_STRING);
  498. extension->is_repeated = true;
  499. extension->is_packed = false;
  500. extension->repeated_string_value =
  501. Arena::CreateMessage<RepeatedPtrField<std::string>>(arena_);
  502. } else {
  503. GOOGLE_DCHECK_TYPE(*extension, REPEATED_FIELD, STRING);
  504. }
  505. return extension->repeated_string_value->Add();
  506. }
  507. // -------------------------------------------------------------------
  508. // Messages
  509. const MessageLite& ExtensionSet::GetMessage(
  510. int number, const MessageLite& default_value) const {
  511. const Extension* extension = FindOrNull(number);
  512. if (extension == NULL) {
  513. // Not present. Return the default value.
  514. return default_value;
  515. } else {
  516. GOOGLE_DCHECK_TYPE(*extension, OPTIONAL_FIELD, MESSAGE);
  517. if (extension->is_lazy) {
  518. return extension->lazymessage_value->GetMessage(default_value);
  519. } else {
  520. return *extension->message_value;
  521. }
  522. }
  523. }
  524. // Defined in extension_set_heavy.cc.
  525. // const MessageLite& ExtensionSet::GetMessage(int number,
  526. // const Descriptor* message_type,
  527. // MessageFactory* factory) const
  528. MessageLite* ExtensionSet::MutableMessage(int number, FieldType type,
  529. const MessageLite& prototype,
  530. const FieldDescriptor* descriptor) {
  531. Extension* extension;
  532. if (MaybeNewExtension(number, descriptor, &extension)) {
  533. extension->type = type;
  534. GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_MESSAGE);
  535. extension->is_repeated = false;
  536. extension->is_lazy = false;
  537. extension->message_value = prototype.New(arena_);
  538. extension->is_cleared = false;
  539. return extension->message_value;
  540. } else {
  541. GOOGLE_DCHECK_TYPE(*extension, OPTIONAL_FIELD, MESSAGE);
  542. extension->is_cleared = false;
  543. if (extension->is_lazy) {
  544. return extension->lazymessage_value->MutableMessage(prototype);
  545. } else {
  546. return extension->message_value;
  547. }
  548. }
  549. }
  550. // Defined in extension_set_heavy.cc.
  551. // MessageLite* ExtensionSet::MutableMessage(int number, FieldType type,
  552. // const Descriptor* message_type,
  553. // MessageFactory* factory)
  554. void ExtensionSet::SetAllocatedMessage(int number, FieldType type,
  555. const FieldDescriptor* descriptor,
  556. MessageLite* message) {
  557. if (message == NULL) {
  558. ClearExtension(number);
  559. return;
  560. }
  561. Arena* message_arena = message->GetArena();
  562. Extension* extension;
  563. if (MaybeNewExtension(number, descriptor, &extension)) {
  564. extension->type = type;
  565. GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_MESSAGE);
  566. extension->is_repeated = false;
  567. extension->is_lazy = false;
  568. if (message_arena == arena_) {
  569. extension->message_value = message;
  570. } else if (message_arena == NULL) {
  571. extension->message_value = message;
  572. arena_->Own(message); // not NULL because not equal to message_arena
  573. } else {
  574. extension->message_value = message->New(arena_);
  575. extension->message_value->CheckTypeAndMergeFrom(*message);
  576. }
  577. } else {
  578. GOOGLE_DCHECK_TYPE(*extension, OPTIONAL_FIELD, MESSAGE);
  579. if (extension->is_lazy) {
  580. extension->lazymessage_value->SetAllocatedMessage(message);
  581. } else {
  582. if (arena_ == NULL) {
  583. delete extension->message_value;
  584. }
  585. if (message_arena == arena_) {
  586. extension->message_value = message;
  587. } else if (message_arena == NULL) {
  588. extension->message_value = message;
  589. arena_->Own(message); // not NULL because not equal to message_arena
  590. } else {
  591. extension->message_value = message->New(arena_);
  592. extension->message_value->CheckTypeAndMergeFrom(*message);
  593. }
  594. }
  595. }
  596. extension->is_cleared = false;
  597. }
  598. void ExtensionSet::UnsafeArenaSetAllocatedMessage(
  599. int number, FieldType type, const FieldDescriptor* descriptor,
  600. MessageLite* message) {
  601. if (message == NULL) {
  602. ClearExtension(number);
  603. return;
  604. }
  605. Extension* extension;
  606. if (MaybeNewExtension(number, descriptor, &extension)) {
  607. extension->type = type;
  608. GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_MESSAGE);
  609. extension->is_repeated = false;
  610. extension->is_lazy = false;
  611. extension->message_value = message;
  612. } else {
  613. GOOGLE_DCHECK_TYPE(*extension, OPTIONAL_FIELD, MESSAGE);
  614. if (extension->is_lazy) {
  615. extension->lazymessage_value->UnsafeArenaSetAllocatedMessage(message);
  616. } else {
  617. if (arena_ == NULL) {
  618. delete extension->message_value;
  619. }
  620. extension->message_value = message;
  621. }
  622. }
  623. extension->is_cleared = false;
  624. }
  625. MessageLite* ExtensionSet::ReleaseMessage(int number,
  626. const MessageLite& prototype) {
  627. Extension* extension = FindOrNull(number);
  628. if (extension == NULL) {
  629. // Not present. Return NULL.
  630. return NULL;
  631. } else {
  632. GOOGLE_DCHECK_TYPE(*extension, OPTIONAL_FIELD, MESSAGE);
  633. MessageLite* ret = NULL;
  634. if (extension->is_lazy) {
  635. ret = extension->lazymessage_value->ReleaseMessage(prototype);
  636. if (arena_ == NULL) {
  637. delete extension->lazymessage_value;
  638. }
  639. } else {
  640. if (arena_ == NULL) {
  641. ret = extension->message_value;
  642. } else {
  643. // ReleaseMessage() always returns a heap-allocated message, and we are
  644. // on an arena, so we need to make a copy of this message to return.
  645. ret = extension->message_value->New();
  646. ret->CheckTypeAndMergeFrom(*extension->message_value);
  647. }
  648. }
  649. Erase(number);
  650. return ret;
  651. }
  652. }
  653. MessageLite* ExtensionSet::UnsafeArenaReleaseMessage(
  654. int number, const MessageLite& prototype) {
  655. Extension* extension = FindOrNull(number);
  656. if (extension == NULL) {
  657. // Not present. Return NULL.
  658. return NULL;
  659. } else {
  660. GOOGLE_DCHECK_TYPE(*extension, OPTIONAL_FIELD, MESSAGE);
  661. MessageLite* ret = NULL;
  662. if (extension->is_lazy) {
  663. ret = extension->lazymessage_value->UnsafeArenaReleaseMessage(prototype);
  664. if (arena_ == NULL) {
  665. delete extension->lazymessage_value;
  666. }
  667. } else {
  668. ret = extension->message_value;
  669. }
  670. Erase(number);
  671. return ret;
  672. }
  673. }
  674. // Defined in extension_set_heavy.cc.
  675. // MessageLite* ExtensionSet::ReleaseMessage(const FieldDescriptor* descriptor,
  676. // MessageFactory* factory);
  677. const MessageLite& ExtensionSet::GetRepeatedMessage(int number,
  678. int index) const {
  679. const Extension* extension = FindOrNull(number);
  680. GOOGLE_CHECK(extension != NULL) << "Index out-of-bounds (field is empty).";
  681. GOOGLE_DCHECK_TYPE(*extension, REPEATED_FIELD, MESSAGE);
  682. return extension->repeated_message_value->Get(index);
  683. }
  684. MessageLite* ExtensionSet::MutableRepeatedMessage(int number, int index) {
  685. Extension* extension = FindOrNull(number);
  686. GOOGLE_CHECK(extension != NULL) << "Index out-of-bounds (field is empty).";
  687. GOOGLE_DCHECK_TYPE(*extension, REPEATED_FIELD, MESSAGE);
  688. return extension->repeated_message_value->Mutable(index);
  689. }
  690. MessageLite* ExtensionSet::AddMessage(int number, FieldType type,
  691. const MessageLite& prototype,
  692. const FieldDescriptor* descriptor) {
  693. Extension* extension;
  694. if (MaybeNewExtension(number, descriptor, &extension)) {
  695. extension->type = type;
  696. GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_MESSAGE);
  697. extension->is_repeated = true;
  698. extension->repeated_message_value =
  699. Arena::CreateMessage<RepeatedPtrField<MessageLite>>(arena_);
  700. } else {
  701. GOOGLE_DCHECK_TYPE(*extension, REPEATED_FIELD, MESSAGE);
  702. }
  703. // RepeatedPtrField<MessageLite> does not know how to Add() since it cannot
  704. // allocate an abstract object, so we have to be tricky.
  705. MessageLite* result = reinterpret_cast<internal::RepeatedPtrFieldBase*>(
  706. extension->repeated_message_value)
  707. ->AddFromCleared<GenericTypeHandler<MessageLite>>();
  708. if (result == NULL) {
  709. result = prototype.New(arena_);
  710. extension->repeated_message_value->AddAllocated(result);
  711. }
  712. return result;
  713. }
  714. // Defined in extension_set_heavy.cc.
  715. // MessageLite* ExtensionSet::AddMessage(int number, FieldType type,
  716. // const Descriptor* message_type,
  717. // MessageFactory* factory)
  718. #undef GOOGLE_DCHECK_TYPE
  719. void ExtensionSet::RemoveLast(int number) {
  720. Extension* extension = FindOrNull(number);
  721. GOOGLE_CHECK(extension != NULL) << "Index out-of-bounds (field is empty).";
  722. GOOGLE_DCHECK(extension->is_repeated);
  723. switch (cpp_type(extension->type)) {
  724. case WireFormatLite::CPPTYPE_INT32:
  725. extension->repeated_int32_value->RemoveLast();
  726. break;
  727. case WireFormatLite::CPPTYPE_INT64:
  728. extension->repeated_int64_value->RemoveLast();
  729. break;
  730. case WireFormatLite::CPPTYPE_UINT32:
  731. extension->repeated_uint32_value->RemoveLast();
  732. break;
  733. case WireFormatLite::CPPTYPE_UINT64:
  734. extension->repeated_uint64_value->RemoveLast();
  735. break;
  736. case WireFormatLite::CPPTYPE_FLOAT:
  737. extension->repeated_float_value->RemoveLast();
  738. break;
  739. case WireFormatLite::CPPTYPE_DOUBLE:
  740. extension->repeated_double_value->RemoveLast();
  741. break;
  742. case WireFormatLite::CPPTYPE_BOOL:
  743. extension->repeated_bool_value->RemoveLast();
  744. break;
  745. case WireFormatLite::CPPTYPE_ENUM:
  746. extension->repeated_enum_value->RemoveLast();
  747. break;
  748. case WireFormatLite::CPPTYPE_STRING:
  749. extension->repeated_string_value->RemoveLast();
  750. break;
  751. case WireFormatLite::CPPTYPE_MESSAGE:
  752. extension->repeated_message_value->RemoveLast();
  753. break;
  754. }
  755. }
  756. MessageLite* ExtensionSet::ReleaseLast(int number) {
  757. Extension* extension = FindOrNull(number);
  758. GOOGLE_CHECK(extension != NULL) << "Index out-of-bounds (field is empty).";
  759. GOOGLE_DCHECK(extension->is_repeated);
  760. GOOGLE_DCHECK(cpp_type(extension->type) == WireFormatLite::CPPTYPE_MESSAGE);
  761. return extension->repeated_message_value->ReleaseLast();
  762. }
  763. void ExtensionSet::SwapElements(int number, int index1, int index2) {
  764. Extension* extension = FindOrNull(number);
  765. GOOGLE_CHECK(extension != NULL) << "Index out-of-bounds (field is empty).";
  766. GOOGLE_DCHECK(extension->is_repeated);
  767. switch (cpp_type(extension->type)) {
  768. case WireFormatLite::CPPTYPE_INT32:
  769. extension->repeated_int32_value->SwapElements(index1, index2);
  770. break;
  771. case WireFormatLite::CPPTYPE_INT64:
  772. extension->repeated_int64_value->SwapElements(index1, index2);
  773. break;
  774. case WireFormatLite::CPPTYPE_UINT32:
  775. extension->repeated_uint32_value->SwapElements(index1, index2);
  776. break;
  777. case WireFormatLite::CPPTYPE_UINT64:
  778. extension->repeated_uint64_value->SwapElements(index1, index2);
  779. break;
  780. case WireFormatLite::CPPTYPE_FLOAT:
  781. extension->repeated_float_value->SwapElements(index1, index2);
  782. break;
  783. case WireFormatLite::CPPTYPE_DOUBLE:
  784. extension->repeated_double_value->SwapElements(index1, index2);
  785. break;
  786. case WireFormatLite::CPPTYPE_BOOL:
  787. extension->repeated_bool_value->SwapElements(index1, index2);
  788. break;
  789. case WireFormatLite::CPPTYPE_ENUM:
  790. extension->repeated_enum_value->SwapElements(index1, index2);
  791. break;
  792. case WireFormatLite::CPPTYPE_STRING:
  793. extension->repeated_string_value->SwapElements(index1, index2);
  794. break;
  795. case WireFormatLite::CPPTYPE_MESSAGE:
  796. extension->repeated_message_value->SwapElements(index1, index2);
  797. break;
  798. }
  799. }
  800. // ===================================================================
  801. void ExtensionSet::Clear() {
  802. ForEach([](int /* number */, Extension& ext) { ext.Clear(); });
  803. }
  804. namespace {
  805. // Computes the size of a std::set_union without constructing the union.
  806. template <typename ItX, typename ItY>
  807. size_t SizeOfUnion(ItX it_xs, ItX end_xs, ItY it_ys, ItY end_ys) {
  808. size_t result = 0;
  809. while (it_xs != end_xs && it_ys != end_ys) {
  810. ++result;
  811. if (it_xs->first < it_ys->first) {
  812. ++it_xs;
  813. } else if (it_xs->first == it_ys->first) {
  814. ++it_xs;
  815. ++it_ys;
  816. } else {
  817. ++it_ys;
  818. }
  819. }
  820. result += std::distance(it_xs, end_xs);
  821. result += std::distance(it_ys, end_ys);
  822. return result;
  823. }
  824. } // namespace
  825. void ExtensionSet::MergeFrom(const ExtensionSet& other) {
  826. if (PROTOBUF_PREDICT_TRUE(!is_large())) {
  827. if (PROTOBUF_PREDICT_TRUE(!other.is_large())) {
  828. GrowCapacity(SizeOfUnion(flat_begin(), flat_end(), other.flat_begin(),
  829. other.flat_end()));
  830. } else {
  831. GrowCapacity(SizeOfUnion(flat_begin(), flat_end(),
  832. other.map_.large->begin(),
  833. other.map_.large->end()));
  834. }
  835. }
  836. other.ForEach([this](int number, const Extension& ext) {
  837. this->InternalExtensionMergeFrom(number, ext);
  838. });
  839. }
  840. void ExtensionSet::InternalExtensionMergeFrom(
  841. int number, const Extension& other_extension) {
  842. if (other_extension.is_repeated) {
  843. Extension* extension;
  844. bool is_new =
  845. MaybeNewExtension(number, other_extension.descriptor, &extension);
  846. if (is_new) {
  847. // Extension did not already exist in set.
  848. extension->type = other_extension.type;
  849. extension->is_packed = other_extension.is_packed;
  850. extension->is_repeated = true;
  851. } else {
  852. GOOGLE_DCHECK_EQ(extension->type, other_extension.type);
  853. GOOGLE_DCHECK_EQ(extension->is_packed, other_extension.is_packed);
  854. GOOGLE_DCHECK(extension->is_repeated);
  855. }
  856. switch (cpp_type(other_extension.type)) {
  857. #define HANDLE_TYPE(UPPERCASE, LOWERCASE, REPEATED_TYPE) \
  858. case WireFormatLite::CPPTYPE_##UPPERCASE: \
  859. if (is_new) { \
  860. extension->repeated_##LOWERCASE##_value = \
  861. Arena::CreateMessage<REPEATED_TYPE>(arena_); \
  862. } \
  863. extension->repeated_##LOWERCASE##_value->MergeFrom( \
  864. *other_extension.repeated_##LOWERCASE##_value); \
  865. break;
  866. HANDLE_TYPE(INT32, int32, RepeatedField<int32>);
  867. HANDLE_TYPE(INT64, int64, RepeatedField<int64>);
  868. HANDLE_TYPE(UINT32, uint32, RepeatedField<uint32>);
  869. HANDLE_TYPE(UINT64, uint64, RepeatedField<uint64>);
  870. HANDLE_TYPE(FLOAT, float, RepeatedField<float>);
  871. HANDLE_TYPE(DOUBLE, double, RepeatedField<double>);
  872. HANDLE_TYPE(BOOL, bool, RepeatedField<bool>);
  873. HANDLE_TYPE(ENUM, enum, RepeatedField<int>);
  874. HANDLE_TYPE(STRING, string, RepeatedPtrField<std::string>);
  875. #undef HANDLE_TYPE
  876. case WireFormatLite::CPPTYPE_MESSAGE:
  877. if (is_new) {
  878. extension->repeated_message_value =
  879. Arena::CreateMessage<RepeatedPtrField<MessageLite>>(arena_);
  880. }
  881. // We can't call RepeatedPtrField<MessageLite>::MergeFrom() because
  882. // it would attempt to allocate new objects.
  883. RepeatedPtrField<MessageLite>* other_repeated_message =
  884. other_extension.repeated_message_value;
  885. for (int i = 0; i < other_repeated_message->size(); i++) {
  886. const MessageLite& other_message = other_repeated_message->Get(i);
  887. MessageLite* target =
  888. reinterpret_cast<internal::RepeatedPtrFieldBase*>(
  889. extension->repeated_message_value)
  890. ->AddFromCleared<GenericTypeHandler<MessageLite>>();
  891. if (target == NULL) {
  892. target = other_message.New(arena_);
  893. extension->repeated_message_value->AddAllocated(target);
  894. }
  895. target->CheckTypeAndMergeFrom(other_message);
  896. }
  897. break;
  898. }
  899. } else {
  900. if (!other_extension.is_cleared) {
  901. switch (cpp_type(other_extension.type)) {
  902. #define HANDLE_TYPE(UPPERCASE, LOWERCASE, CAMELCASE) \
  903. case WireFormatLite::CPPTYPE_##UPPERCASE: \
  904. Set##CAMELCASE(number, other_extension.type, \
  905. other_extension.LOWERCASE##_value, \
  906. other_extension.descriptor); \
  907. break;
  908. HANDLE_TYPE(INT32, int32, Int32);
  909. HANDLE_TYPE(INT64, int64, Int64);
  910. HANDLE_TYPE(UINT32, uint32, UInt32);
  911. HANDLE_TYPE(UINT64, uint64, UInt64);
  912. HANDLE_TYPE(FLOAT, float, Float);
  913. HANDLE_TYPE(DOUBLE, double, Double);
  914. HANDLE_TYPE(BOOL, bool, Bool);
  915. HANDLE_TYPE(ENUM, enum, Enum);
  916. #undef HANDLE_TYPE
  917. case WireFormatLite::CPPTYPE_STRING:
  918. SetString(number, other_extension.type, *other_extension.string_value,
  919. other_extension.descriptor);
  920. break;
  921. case WireFormatLite::CPPTYPE_MESSAGE: {
  922. Extension* extension;
  923. bool is_new =
  924. MaybeNewExtension(number, other_extension.descriptor, &extension);
  925. if (is_new) {
  926. extension->type = other_extension.type;
  927. extension->is_packed = other_extension.is_packed;
  928. extension->is_repeated = false;
  929. if (other_extension.is_lazy) {
  930. extension->is_lazy = true;
  931. extension->lazymessage_value =
  932. other_extension.lazymessage_value->New(arena_);
  933. extension->lazymessage_value->MergeFrom(
  934. *other_extension.lazymessage_value);
  935. } else {
  936. extension->is_lazy = false;
  937. extension->message_value =
  938. other_extension.message_value->New(arena_);
  939. extension->message_value->CheckTypeAndMergeFrom(
  940. *other_extension.message_value);
  941. }
  942. } else {
  943. GOOGLE_DCHECK_EQ(extension->type, other_extension.type);
  944. GOOGLE_DCHECK_EQ(extension->is_packed, other_extension.is_packed);
  945. GOOGLE_DCHECK(!extension->is_repeated);
  946. if (other_extension.is_lazy) {
  947. if (extension->is_lazy) {
  948. extension->lazymessage_value->MergeFrom(
  949. *other_extension.lazymessage_value);
  950. } else {
  951. extension->message_value->CheckTypeAndMergeFrom(
  952. other_extension.lazymessage_value->GetMessage(
  953. *extension->message_value));
  954. }
  955. } else {
  956. if (extension->is_lazy) {
  957. extension->lazymessage_value
  958. ->MutableMessage(*other_extension.message_value)
  959. ->CheckTypeAndMergeFrom(*other_extension.message_value);
  960. } else {
  961. extension->message_value->CheckTypeAndMergeFrom(
  962. *other_extension.message_value);
  963. }
  964. }
  965. }
  966. extension->is_cleared = false;
  967. break;
  968. }
  969. }
  970. }
  971. }
  972. }
  973. void ExtensionSet::Swap(ExtensionSet* x) {
  974. if (GetArenaNoVirtual() == x->GetArenaNoVirtual()) {
  975. using std::swap;
  976. swap(flat_capacity_, x->flat_capacity_);
  977. swap(flat_size_, x->flat_size_);
  978. swap(map_, x->map_);
  979. } else {
  980. // TODO(cfallin, rohananil): We maybe able to optimize a case where we are
  981. // swapping from heap to arena-allocated extension set, by just Own()'ing
  982. // the extensions.
  983. ExtensionSet extension_set;
  984. extension_set.MergeFrom(*x);
  985. x->Clear();
  986. x->MergeFrom(*this);
  987. Clear();
  988. MergeFrom(extension_set);
  989. }
  990. }
  991. void ExtensionSet::SwapExtension(ExtensionSet* other, int number) {
  992. if (this == other) return;
  993. Extension* this_ext = FindOrNull(number);
  994. Extension* other_ext = other->FindOrNull(number);
  995. if (this_ext == NULL && other_ext == NULL) {
  996. return;
  997. }
  998. if (this_ext != NULL && other_ext != NULL) {
  999. if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
  1000. using std::swap;
  1001. swap(*this_ext, *other_ext);
  1002. } else {
  1003. // TODO(cfallin, rohananil): We could further optimize these cases,
  1004. // especially avoid creation of ExtensionSet, and move MergeFrom logic
  1005. // into Extensions itself (which takes arena as an argument).
  1006. // We do it this way to reuse the copy-across-arenas logic already
  1007. // implemented in ExtensionSet's MergeFrom.
  1008. ExtensionSet temp;
  1009. temp.InternalExtensionMergeFrom(number, *other_ext);
  1010. Extension* temp_ext = temp.FindOrNull(number);
  1011. other_ext->Clear();
  1012. other->InternalExtensionMergeFrom(number, *this_ext);
  1013. this_ext->Clear();
  1014. InternalExtensionMergeFrom(number, *temp_ext);
  1015. }
  1016. return;
  1017. }
  1018. if (this_ext == NULL) {
  1019. if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
  1020. *Insert(number).first = *other_ext;
  1021. } else {
  1022. InternalExtensionMergeFrom(number, *other_ext);
  1023. }
  1024. other->Erase(number);
  1025. return;
  1026. }
  1027. if (other_ext == NULL) {
  1028. if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
  1029. *other->Insert(number).first = *this_ext;
  1030. } else {
  1031. other->InternalExtensionMergeFrom(number, *this_ext);
  1032. }
  1033. Erase(number);
  1034. return;
  1035. }
  1036. }
  1037. bool ExtensionSet::IsInitialized() const {
  1038. // Extensions are never required. However, we need to check that all
  1039. // embedded messages are initialized.
  1040. if (PROTOBUF_PREDICT_FALSE(is_large())) {
  1041. for (const auto& kv : *map_.large) {
  1042. if (!kv.second.IsInitialized()) return false;
  1043. }
  1044. return true;
  1045. }
  1046. for (const KeyValue* it = flat_begin(); it != flat_end(); ++it) {
  1047. if (!it->second.IsInitialized()) return false;
  1048. }
  1049. return true;
  1050. }
  1051. bool ExtensionSet::FindExtensionInfoFromTag(uint32 tag,
  1052. ExtensionFinder* extension_finder,
  1053. int* field_number,
  1054. ExtensionInfo* extension,
  1055. bool* was_packed_on_wire) {
  1056. *field_number = WireFormatLite::GetTagFieldNumber(tag);
  1057. WireFormatLite::WireType wire_type = WireFormatLite::GetTagWireType(tag);
  1058. return FindExtensionInfoFromFieldNumber(wire_type, *field_number,
  1059. extension_finder, extension,
  1060. was_packed_on_wire);
  1061. }
  1062. bool ExtensionSet::FindExtensionInfoFromFieldNumber(
  1063. int wire_type, int field_number, ExtensionFinder* extension_finder,
  1064. ExtensionInfo* extension, bool* was_packed_on_wire) {
  1065. if (!extension_finder->Find(field_number, extension)) {
  1066. return false;
  1067. }
  1068. WireFormatLite::WireType expected_wire_type =
  1069. WireFormatLite::WireTypeForFieldType(real_type(extension->type));
  1070. // Check if this is a packed field.
  1071. *was_packed_on_wire = false;
  1072. if (extension->is_repeated &&
  1073. wire_type == WireFormatLite::WIRETYPE_LENGTH_DELIMITED &&
  1074. is_packable(expected_wire_type)) {
  1075. *was_packed_on_wire = true;
  1076. return true;
  1077. }
  1078. // Otherwise the wire type must match.
  1079. return expected_wire_type == wire_type;
  1080. }
  1081. bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input,
  1082. ExtensionFinder* extension_finder,
  1083. FieldSkipper* field_skipper) {
  1084. int number;
  1085. bool was_packed_on_wire;
  1086. ExtensionInfo extension;
  1087. if (!FindExtensionInfoFromTag(tag, extension_finder, &number, &extension,
  1088. &was_packed_on_wire)) {
  1089. return field_skipper->SkipField(input, tag);
  1090. } else {
  1091. return ParseFieldWithExtensionInfo(number, was_packed_on_wire, extension,
  1092. input, field_skipper);
  1093. }
  1094. }
  1095. const char* ExtensionSet::ParseField(
  1096. uint64 tag, const char* ptr, const MessageLite* containing_type,
  1097. internal::InternalMetadataWithArenaLite* metadata,
  1098. internal::ParseContext* ctx) {
  1099. GeneratedExtensionFinder finder(containing_type);
  1100. int number = tag >> 3;
  1101. bool was_packed_on_wire;
  1102. ExtensionInfo extension;
  1103. if (!FindExtensionInfoFromFieldNumber(tag & 7, number, &finder, &extension,
  1104. &was_packed_on_wire)) {
  1105. return UnknownFieldParse(tag, metadata->mutable_unknown_fields(), ptr, ctx);
  1106. }
  1107. return ParseFieldWithExtensionInfo(number, was_packed_on_wire, extension,
  1108. metadata, ptr, ctx);
  1109. }
  1110. const char* ExtensionSet::ParseMessageSetItem(
  1111. const char* ptr, const MessageLite* containing_type,
  1112. internal::InternalMetadataWithArenaLite* metadata,
  1113. internal::ParseContext* ctx) {
  1114. return ParseMessageSetItemTmpl(ptr, containing_type, metadata, ctx);
  1115. }
  1116. bool ExtensionSet::ParseFieldWithExtensionInfo(int number,
  1117. bool was_packed_on_wire,
  1118. const ExtensionInfo& extension,
  1119. io::CodedInputStream* input,
  1120. FieldSkipper* field_skipper) {
  1121. // Explicitly not read extension.is_packed, instead check whether the field
  1122. // was encoded in packed form on the wire.
  1123. if (was_packed_on_wire) {
  1124. uint32 size;
  1125. if (!input->ReadVarint32(&size)) return false;
  1126. io::CodedInputStream::Limit limit = input->PushLimit(size);
  1127. switch (extension.type) {
  1128. #define HANDLE_TYPE(UPPERCASE, CPP_CAMELCASE, CPP_LOWERCASE) \
  1129. case WireFormatLite::TYPE_##UPPERCASE: \
  1130. while (input->BytesUntilLimit() > 0) { \
  1131. CPP_LOWERCASE value; \
  1132. if (!WireFormatLite::ReadPrimitive<CPP_LOWERCASE, \
  1133. WireFormatLite::TYPE_##UPPERCASE>( \
  1134. input, &value)) \
  1135. return false; \
  1136. Add##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, \
  1137. extension.is_packed, value, extension.descriptor); \
  1138. } \
  1139. break
  1140. HANDLE_TYPE(INT32, Int32, int32);
  1141. HANDLE_TYPE(INT64, Int64, int64);
  1142. HANDLE_TYPE(UINT32, UInt32, uint32);
  1143. HANDLE_TYPE(UINT64, UInt64, uint64);
  1144. HANDLE_TYPE(SINT32, Int32, int32);
  1145. HANDLE_TYPE(SINT64, Int64, int64);
  1146. HANDLE_TYPE(FIXED32, UInt32, uint32);
  1147. HANDLE_TYPE(FIXED64, UInt64, uint64);
  1148. HANDLE_TYPE(SFIXED32, Int32, int32);
  1149. HANDLE_TYPE(SFIXED64, Int64, int64);
  1150. HANDLE_TYPE(FLOAT, Float, float);
  1151. HANDLE_TYPE(DOUBLE, Double, double);
  1152. HANDLE_TYPE(BOOL, Bool, bool);
  1153. #undef HANDLE_TYPE
  1154. case WireFormatLite::TYPE_ENUM:
  1155. while (input->BytesUntilLimit() > 0) {
  1156. int value;
  1157. if (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(
  1158. input, &value))
  1159. return false;
  1160. if (extension.enum_validity_check.func(
  1161. extension.enum_validity_check.arg, value)) {
  1162. AddEnum(number, WireFormatLite::TYPE_ENUM, extension.is_packed,
  1163. value, extension.descriptor);
  1164. } else {
  1165. // Invalid value. Treat as unknown.
  1166. field_skipper->SkipUnknownEnum(number, value);
  1167. }
  1168. }
  1169. break;
  1170. case WireFormatLite::TYPE_STRING:
  1171. case WireFormatLite::TYPE_BYTES:
  1172. case WireFormatLite::TYPE_GROUP:
  1173. case WireFormatLite::TYPE_MESSAGE:
  1174. GOOGLE_LOG(FATAL) << "Non-primitive types can't be packed.";
  1175. break;
  1176. }
  1177. input->PopLimit(limit);
  1178. } else {
  1179. switch (extension.type) {
  1180. #define HANDLE_TYPE(UPPERCASE, CPP_CAMELCASE, CPP_LOWERCASE) \
  1181. case WireFormatLite::TYPE_##UPPERCASE: { \
  1182. CPP_LOWERCASE value; \
  1183. if (!WireFormatLite::ReadPrimitive<CPP_LOWERCASE, \
  1184. WireFormatLite::TYPE_##UPPERCASE>( \
  1185. input, &value)) \
  1186. return false; \
  1187. if (extension.is_repeated) { \
  1188. Add##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, \
  1189. extension.is_packed, value, extension.descriptor); \
  1190. } else { \
  1191. Set##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, value, \
  1192. extension.descriptor); \
  1193. } \
  1194. } break
  1195. HANDLE_TYPE(INT32, Int32, int32);
  1196. HANDLE_TYPE(INT64, Int64, int64);
  1197. HANDLE_TYPE(UINT32, UInt32, uint32);
  1198. HANDLE_TYPE(UINT64, UInt64, uint64);
  1199. HANDLE_TYPE(SINT32, Int32, int32);
  1200. HANDLE_TYPE(SINT64, Int64, int64);
  1201. HANDLE_TYPE(FIXED32, UInt32, uint32);
  1202. HANDLE_TYPE(FIXED64, UInt64, uint64);
  1203. HANDLE_TYPE(SFIXED32, Int32, int32);
  1204. HANDLE_TYPE(SFIXED64, Int64, int64);
  1205. HANDLE_TYPE(FLOAT, Float, float);
  1206. HANDLE_TYPE(DOUBLE, Double, double);
  1207. HANDLE_TYPE(BOOL, Bool, bool);
  1208. #undef HANDLE_TYPE
  1209. case WireFormatLite::TYPE_ENUM: {
  1210. int value;
  1211. if (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(
  1212. input, &value))
  1213. return false;
  1214. if (!extension.enum_validity_check.func(
  1215. extension.enum_validity_check.arg, value)) {
  1216. // Invalid value. Treat as unknown.
  1217. field_skipper->SkipUnknownEnum(number, value);
  1218. } else if (extension.is_repeated) {
  1219. AddEnum(number, WireFormatLite::TYPE_ENUM, extension.is_packed, value,
  1220. extension.descriptor);
  1221. } else {
  1222. SetEnum(number, WireFormatLite::TYPE_ENUM, value,
  1223. extension.descriptor);
  1224. }
  1225. break;
  1226. }
  1227. case WireFormatLite::TYPE_STRING: {
  1228. std::string* value =
  1229. extension.is_repeated
  1230. ? AddString(number, WireFormatLite::TYPE_STRING,
  1231. extension.descriptor)
  1232. : MutableString(number, WireFormatLite::TYPE_STRING,
  1233. extension.descriptor);
  1234. if (!WireFormatLite::ReadString(input, value)) return false;
  1235. break;
  1236. }
  1237. case WireFormatLite::TYPE_BYTES: {
  1238. std::string* value =
  1239. extension.is_repeated
  1240. ? AddString(number, WireFormatLite::TYPE_BYTES,
  1241. extension.descriptor)
  1242. : MutableString(number, WireFormatLite::TYPE_BYTES,
  1243. extension.descriptor);
  1244. if (!WireFormatLite::ReadBytes(input, value)) return false;
  1245. break;
  1246. }
  1247. case WireFormatLite::TYPE_GROUP: {
  1248. MessageLite* value =
  1249. extension.is_repeated
  1250. ? AddMessage(number, WireFormatLite::TYPE_GROUP,
  1251. *extension.message_info.prototype,
  1252. extension.descriptor)
  1253. : MutableMessage(number, WireFormatLite::TYPE_GROUP,
  1254. *extension.message_info.prototype,
  1255. extension.descriptor);
  1256. if (!WireFormatLite::ReadGroup(number, input, value)) return false;
  1257. break;
  1258. }
  1259. case WireFormatLite::TYPE_MESSAGE: {
  1260. MessageLite* value =
  1261. extension.is_repeated
  1262. ? AddMessage(number, WireFormatLite::TYPE_MESSAGE,
  1263. *extension.message_info.prototype,
  1264. extension.descriptor)
  1265. : MutableMessage(number, WireFormatLite::TYPE_MESSAGE,
  1266. *extension.message_info.prototype,
  1267. extension.descriptor);
  1268. if (!WireFormatLite::ReadMessage(input, value)) return false;
  1269. break;
  1270. }
  1271. }
  1272. }
  1273. return true;
  1274. }
  1275. bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input,
  1276. const MessageLite* containing_type) {
  1277. FieldSkipper skipper;
  1278. GeneratedExtensionFinder finder(containing_type);
  1279. return ParseField(tag, input, &finder, &skipper);
  1280. }
  1281. bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input,
  1282. const MessageLite* containing_type,
  1283. io::CodedOutputStream* unknown_fields) {
  1284. CodedOutputStreamFieldSkipper skipper(unknown_fields);
  1285. GeneratedExtensionFinder finder(containing_type);
  1286. return ParseField(tag, input, &finder, &skipper);
  1287. }
  1288. bool ExtensionSet::ParseMessageSetLite(io::CodedInputStream* input,
  1289. ExtensionFinder* extension_finder,
  1290. FieldSkipper* field_skipper) {
  1291. while (true) {
  1292. const uint32 tag = input->ReadTag();
  1293. switch (tag) {
  1294. case 0:
  1295. return true;
  1296. case WireFormatLite::kMessageSetItemStartTag:
  1297. if (!ParseMessageSetItemLite(input, extension_finder, field_skipper)) {
  1298. return false;
  1299. }
  1300. break;
  1301. default:
  1302. if (!ParseField(tag, input, extension_finder, field_skipper)) {
  1303. return false;
  1304. }
  1305. break;
  1306. }
  1307. }
  1308. }
  1309. bool ExtensionSet::ParseMessageSetItemLite(io::CodedInputStream* input,
  1310. ExtensionFinder* extension_finder,
  1311. FieldSkipper* field_skipper) {
  1312. struct MSLite {
  1313. bool ParseField(int type_id, io::CodedInputStream* input) {
  1314. return me->ParseField(
  1315. WireFormatLite::WIRETYPE_LENGTH_DELIMITED + 8 * type_id, input,
  1316. extension_finder, field_skipper);
  1317. }
  1318. bool SkipField(uint32 tag, io::CodedInputStream* input) {
  1319. return field_skipper->SkipField(input, tag);
  1320. }
  1321. ExtensionSet* me;
  1322. ExtensionFinder* extension_finder;
  1323. FieldSkipper* field_skipper;
  1324. };
  1325. return ParseMessageSetItemImpl(input,
  1326. MSLite{this, extension_finder, field_skipper});
  1327. }
  1328. bool ExtensionSet::ParseMessageSet(io::CodedInputStream* input,
  1329. const MessageLite* containing_type,
  1330. std::string* unknown_fields) {
  1331. io::StringOutputStream zcis(unknown_fields);
  1332. io::CodedOutputStream output(&zcis);
  1333. CodedOutputStreamFieldSkipper skipper(&output);
  1334. GeneratedExtensionFinder finder(containing_type);
  1335. return ParseMessageSetLite(input, &finder, &skipper);
  1336. }
  1337. uint8* ExtensionSet::InternalSerializeWithCachedSizesToArray(
  1338. int start_field_number, int end_field_number, uint8* target,
  1339. io::EpsCopyOutputStream* stream) const {
  1340. if (PROTOBUF_PREDICT_FALSE(is_large())) {
  1341. const auto& end = map_.large->end();
  1342. for (auto it = map_.large->lower_bound(start_field_number);
  1343. it != end && it->first < end_field_number; ++it) {
  1344. target = it->second.InternalSerializeFieldWithCachedSizesToArray(
  1345. it->first, target, stream);
  1346. }
  1347. return target;
  1348. }
  1349. const KeyValue* end = flat_end();
  1350. for (const KeyValue* it = std::lower_bound(
  1351. flat_begin(), end, start_field_number, KeyValue::FirstComparator());
  1352. it != end && it->first < end_field_number; ++it) {
  1353. target = it->second.InternalSerializeFieldWithCachedSizesToArray(
  1354. it->first, target, stream);
  1355. }
  1356. return target;
  1357. }
  1358. uint8* ExtensionSet::InternalSerializeMessageSetWithCachedSizesToArray(
  1359. uint8* target, io::EpsCopyOutputStream* stream) const {
  1360. ForEach([&target, stream](int number, const Extension& ext) {
  1361. target = ext.InternalSerializeMessageSetItemWithCachedSizesToArray(
  1362. number, target, stream);
  1363. });
  1364. return target;
  1365. }
  1366. size_t ExtensionSet::ByteSize() const {
  1367. size_t total_size = 0;
  1368. ForEach([&total_size](int number, const Extension& ext) {
  1369. total_size += ext.ByteSize(number);
  1370. });
  1371. return total_size;
  1372. }
  1373. // Defined in extension_set_heavy.cc.
  1374. // int ExtensionSet::SpaceUsedExcludingSelf() const
  1375. bool ExtensionSet::MaybeNewExtension(int number,
  1376. const FieldDescriptor* descriptor,
  1377. Extension** result) {
  1378. bool extension_is_new = false;
  1379. std::tie(*result, extension_is_new) = Insert(number);
  1380. (*result)->descriptor = descriptor;
  1381. return extension_is_new;
  1382. }
  1383. // ===================================================================
  1384. // Methods of ExtensionSet::Extension
  1385. void ExtensionSet::Extension::Clear() {
  1386. if (is_repeated) {
  1387. switch (cpp_type(type)) {
  1388. #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \
  1389. case WireFormatLite::CPPTYPE_##UPPERCASE: \
  1390. repeated_##LOWERCASE##_value->Clear(); \
  1391. break
  1392. HANDLE_TYPE(INT32, int32);
  1393. HANDLE_TYPE(INT64, int64);
  1394. HANDLE_TYPE(UINT32, uint32);
  1395. HANDLE_TYPE(UINT64, uint64);
  1396. HANDLE_TYPE(FLOAT, float);
  1397. HANDLE_TYPE(DOUBLE, double);
  1398. HANDLE_TYPE(BOOL, bool);
  1399. HANDLE_TYPE(ENUM, enum);
  1400. HANDLE_TYPE(STRING, string);
  1401. HANDLE_TYPE(MESSAGE, message);
  1402. #undef HANDLE_TYPE
  1403. }
  1404. } else {
  1405. if (!is_cleared) {
  1406. switch (cpp_type(type)) {
  1407. case WireFormatLite::CPPTYPE_STRING:
  1408. string_value->clear();
  1409. break;
  1410. case WireFormatLite::CPPTYPE_MESSAGE:
  1411. if (is_lazy) {
  1412. lazymessage_value->Clear();
  1413. } else {
  1414. message_value->Clear();
  1415. }
  1416. break;
  1417. default:
  1418. // No need to do anything. Get*() will return the default value
  1419. // as long as is_cleared is true and Set*() will overwrite the
  1420. // previous value.
  1421. break;
  1422. }
  1423. is_cleared = true;
  1424. }
  1425. }
  1426. }
  1427. size_t ExtensionSet::Extension::ByteSize(int number) const {
  1428. size_t result = 0;
  1429. if (is_repeated) {
  1430. if (is_packed) {
  1431. switch (real_type(type)) {
  1432. #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
  1433. case WireFormatLite::TYPE_##UPPERCASE: \
  1434. for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \
  1435. result += WireFormatLite::CAMELCASE##Size( \
  1436. repeated_##LOWERCASE##_value->Get(i)); \
  1437. } \
  1438. break
  1439. HANDLE_TYPE(INT32, Int32, int32);
  1440. HANDLE_TYPE(INT64, Int64, int64);
  1441. HANDLE_TYPE(UINT32, UInt32, uint32);
  1442. HANDLE_TYPE(UINT64, UInt64, uint64);
  1443. HANDLE_TYPE(SINT32, SInt32, int32);
  1444. HANDLE_TYPE(SINT64, SInt64, int64);
  1445. HANDLE_TYPE(ENUM, Enum, enum);
  1446. #undef HANDLE_TYPE
  1447. // Stuff with fixed size.
  1448. #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
  1449. case WireFormatLite::TYPE_##UPPERCASE: \
  1450. result += WireFormatLite::k##CAMELCASE##Size * \
  1451. FromIntSize(repeated_##LOWERCASE##_value->size()); \
  1452. break
  1453. HANDLE_TYPE(FIXED32, Fixed32, uint32);
  1454. HANDLE_TYPE(FIXED64, Fixed64, uint64);
  1455. HANDLE_TYPE(SFIXED32, SFixed32, int32);
  1456. HANDLE_TYPE(SFIXED64, SFixed64, int64);
  1457. HANDLE_TYPE(FLOAT, Float, float);
  1458. HANDLE_TYPE(DOUBLE, Double, double);
  1459. HANDLE_TYPE(BOOL, Bool, bool);
  1460. #undef HANDLE_TYPE
  1461. case WireFormatLite::TYPE_STRING:
  1462. case WireFormatLite::TYPE_BYTES:
  1463. case WireFormatLite::TYPE_GROUP:
  1464. case WireFormatLite::TYPE_MESSAGE:
  1465. GOOGLE_LOG(FATAL) << "Non-primitive types can't be packed.";
  1466. break;
  1467. }
  1468. cached_size = ToCachedSize(result);
  1469. if (result > 0) {
  1470. result += io::CodedOutputStream::VarintSize32(result);
  1471. result += io::CodedOutputStream::VarintSize32(WireFormatLite::MakeTag(
  1472. number, WireFormatLite::WIRETYPE_LENGTH_DELIMITED));
  1473. }
  1474. } else {
  1475. size_t tag_size = WireFormatLite::TagSize(number, real_type(type));
  1476. switch (real_type(type)) {
  1477. #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
  1478. case WireFormatLite::TYPE_##UPPERCASE: \
  1479. result += tag_size * FromIntSize(repeated_##LOWERCASE##_value->size()); \
  1480. for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \
  1481. result += WireFormatLite::CAMELCASE##Size( \
  1482. repeated_##LOWERCASE##_value->Get(i)); \
  1483. } \
  1484. break
  1485. HANDLE_TYPE(INT32, Int32, int32);
  1486. HANDLE_TYPE(INT64, Int64, int64);
  1487. HANDLE_TYPE(UINT32, UInt32, uint32);
  1488. HANDLE_TYPE(UINT64, UInt64, uint64);
  1489. HANDLE_TYPE(SINT32, SInt32, int32);
  1490. HANDLE_TYPE(SINT64, SInt64, int64);
  1491. HANDLE_TYPE(STRING, String, string);
  1492. HANDLE_TYPE(BYTES, Bytes, string);
  1493. HANDLE_TYPE(ENUM, Enum, enum);
  1494. HANDLE_TYPE(GROUP, Group, message);
  1495. HANDLE_TYPE(MESSAGE, Message, message);
  1496. #undef HANDLE_TYPE
  1497. // Stuff with fixed size.
  1498. #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
  1499. case WireFormatLite::TYPE_##UPPERCASE: \
  1500. result += (tag_size + WireFormatLite::k##CAMELCASE##Size) * \
  1501. FromIntSize(repeated_##LOWERCASE##_value->size()); \
  1502. break
  1503. HANDLE_TYPE(FIXED32, Fixed32, uint32);
  1504. HANDLE_TYPE(FIXED64, Fixed64, uint64);
  1505. HANDLE_TYPE(SFIXED32, SFixed32, int32);
  1506. HANDLE_TYPE(SFIXED64, SFixed64, int64);
  1507. HANDLE_TYPE(FLOAT, Float, float);
  1508. HANDLE_TYPE(DOUBLE, Double, double);
  1509. HANDLE_TYPE(BOOL, Bool, bool);
  1510. #undef HANDLE_TYPE
  1511. }
  1512. }
  1513. } else if (!is_cleared) {
  1514. result += WireFormatLite::TagSize(number, real_type(type));
  1515. switch (real_type(type)) {
  1516. #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
  1517. case WireFormatLite::TYPE_##UPPERCASE: \
  1518. result += WireFormatLite::CAMELCASE##Size(LOWERCASE); \
  1519. break
  1520. HANDLE_TYPE(INT32, Int32, int32_value);
  1521. HANDLE_TYPE(INT64, Int64, int64_value);
  1522. HANDLE_TYPE(UINT32, UInt32, uint32_value);
  1523. HANDLE_TYPE(UINT64, UInt64, uint64_value);
  1524. HANDLE_TYPE(SINT32, SInt32, int32_value);
  1525. HANDLE_TYPE(SINT64, SInt64, int64_value);
  1526. HANDLE_TYPE(STRING, String, *string_value);
  1527. HANDLE_TYPE(BYTES, Bytes, *string_value);
  1528. HANDLE_TYPE(ENUM, Enum, enum_value);
  1529. HANDLE_TYPE(GROUP, Group, *message_value);
  1530. #undef HANDLE_TYPE
  1531. case WireFormatLite::TYPE_MESSAGE: {
  1532. if (is_lazy) {
  1533. size_t size = lazymessage_value->ByteSizeLong();
  1534. result += io::CodedOutputStream::VarintSize32(size) + size;
  1535. } else {
  1536. result += WireFormatLite::MessageSize(*message_value);
  1537. }
  1538. break;
  1539. }
  1540. // Stuff with fixed size.
  1541. #define HANDLE_TYPE(UPPERCASE, CAMELCASE) \
  1542. case WireFormatLite::TYPE_##UPPERCASE: \
  1543. result += WireFormatLite::k##CAMELCASE##Size; \
  1544. break
  1545. HANDLE_TYPE(FIXED32, Fixed32);
  1546. HANDLE_TYPE(FIXED64, Fixed64);
  1547. HANDLE_TYPE(SFIXED32, SFixed32);
  1548. HANDLE_TYPE(SFIXED64, SFixed64);
  1549. HANDLE_TYPE(FLOAT, Float);
  1550. HANDLE_TYPE(DOUBLE, Double);
  1551. HANDLE_TYPE(BOOL, Bool);
  1552. #undef HANDLE_TYPE
  1553. }
  1554. }
  1555. return result;
  1556. }
  1557. int ExtensionSet::Extension::GetSize() const {
  1558. GOOGLE_DCHECK(is_repeated);
  1559. switch (cpp_type(type)) {
  1560. #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \
  1561. case WireFormatLite::CPPTYPE_##UPPERCASE: \
  1562. return repeated_##LOWERCASE##_value->size()
  1563. HANDLE_TYPE(INT32, int32);
  1564. HANDLE_TYPE(INT64, int64);
  1565. HANDLE_TYPE(UINT32, uint32);
  1566. HANDLE_TYPE(UINT64, uint64);
  1567. HANDLE_TYPE(FLOAT, float);
  1568. HANDLE_TYPE(DOUBLE, double);
  1569. HANDLE_TYPE(BOOL, bool);
  1570. HANDLE_TYPE(ENUM, enum);
  1571. HANDLE_TYPE(STRING, string);
  1572. HANDLE_TYPE(MESSAGE, message);
  1573. #undef HANDLE_TYPE
  1574. }
  1575. GOOGLE_LOG(FATAL) << "Can't get here.";
  1576. return 0;
  1577. }
  1578. // This function deletes all allocated objects. This function should be only
  1579. // called if the Extension was created with an arena.
  1580. void ExtensionSet::Extension::Free() {
  1581. if (is_repeated) {
  1582. switch (cpp_type(type)) {
  1583. #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \
  1584. case WireFormatLite::CPPTYPE_##UPPERCASE: \
  1585. delete repeated_##LOWERCASE##_value; \
  1586. break
  1587. HANDLE_TYPE(INT32, int32);
  1588. HANDLE_TYPE(INT64, int64);
  1589. HANDLE_TYPE(UINT32, uint32);
  1590. HANDLE_TYPE(UINT64, uint64);
  1591. HANDLE_TYPE(FLOAT, float);
  1592. HANDLE_TYPE(DOUBLE, double);
  1593. HANDLE_TYPE(BOOL, bool);
  1594. HANDLE_TYPE(ENUM, enum);
  1595. HANDLE_TYPE(STRING, string);
  1596. HANDLE_TYPE(MESSAGE, message);
  1597. #undef HANDLE_TYPE
  1598. }
  1599. } else {
  1600. switch (cpp_type(type)) {
  1601. case WireFormatLite::CPPTYPE_STRING:
  1602. delete string_value;
  1603. break;
  1604. case WireFormatLite::CPPTYPE_MESSAGE:
  1605. if (is_lazy) {
  1606. delete lazymessage_value;
  1607. } else {
  1608. delete message_value;
  1609. }
  1610. break;
  1611. default:
  1612. break;
  1613. }
  1614. }
  1615. }
  1616. // Defined in extension_set_heavy.cc.
  1617. // int ExtensionSet::Extension::SpaceUsedExcludingSelf() const
  1618. bool ExtensionSet::Extension::IsInitialized() const {
  1619. if (cpp_type(type) == WireFormatLite::CPPTYPE_MESSAGE) {
  1620. if (is_repeated) {
  1621. for (int i = 0; i < repeated_message_value->size(); i++) {
  1622. if (!repeated_message_value->Get(i).IsInitialized()) {
  1623. return false;
  1624. }
  1625. }
  1626. } else {
  1627. if (!is_cleared) {
  1628. if (is_lazy) {
  1629. if (!lazymessage_value->IsInitialized()) return false;
  1630. } else {
  1631. if (!message_value->IsInitialized()) return false;
  1632. }
  1633. }
  1634. }
  1635. }
  1636. return true;
  1637. }
  1638. // Dummy key method to avoid weak vtable.
  1639. void ExtensionSet::LazyMessageExtension::UnusedKeyMethod() {}
  1640. const ExtensionSet::Extension* ExtensionSet::FindOrNull(int key) const {
  1641. if (PROTOBUF_PREDICT_FALSE(is_large())) {
  1642. return FindOrNullInLargeMap(key);
  1643. }
  1644. const KeyValue* end = flat_end();
  1645. const KeyValue* it =
  1646. std::lower_bound(flat_begin(), end, key, KeyValue::FirstComparator());
  1647. if (it != end && it->first == key) {
  1648. return &it->second;
  1649. }
  1650. return NULL;
  1651. }
  1652. const ExtensionSet::Extension* ExtensionSet::FindOrNullInLargeMap(
  1653. int key) const {
  1654. assert(is_large());
  1655. LargeMap::const_iterator it = map_.large->find(key);
  1656. if (it != map_.large->end()) {
  1657. return &it->second;
  1658. }
  1659. return NULL;
  1660. }
  1661. ExtensionSet::Extension* ExtensionSet::FindOrNull(int key) {
  1662. if (PROTOBUF_PREDICT_FALSE(is_large())) {
  1663. return FindOrNullInLargeMap(key);
  1664. }
  1665. KeyValue* end = flat_end();
  1666. KeyValue* it =
  1667. std::lower_bound(flat_begin(), end, key, KeyValue::FirstComparator());
  1668. if (it != end && it->first == key) {
  1669. return &it->second;
  1670. }
  1671. return NULL;
  1672. }
  1673. ExtensionSet::Extension* ExtensionSet::FindOrNullInLargeMap(int key) {
  1674. assert(is_large());
  1675. LargeMap::iterator it = map_.large->find(key);
  1676. if (it != map_.large->end()) {
  1677. return &it->second;
  1678. }
  1679. return NULL;
  1680. }
  1681. std::pair<ExtensionSet::Extension*, bool> ExtensionSet::Insert(int key) {
  1682. if (PROTOBUF_PREDICT_FALSE(is_large())) {
  1683. auto maybe = map_.large->insert({key, Extension()});
  1684. return {&maybe.first->second, maybe.second};
  1685. }
  1686. KeyValue* end = flat_end();
  1687. KeyValue* it =
  1688. std::lower_bound(flat_begin(), end, key, KeyValue::FirstComparator());
  1689. if (it != end && it->first == key) {
  1690. return {&it->second, false};
  1691. }
  1692. if (flat_size_ < flat_capacity_) {
  1693. std::copy_backward(it, end, end + 1);
  1694. ++flat_size_;
  1695. it->first = key;
  1696. it->second = Extension();
  1697. return {&it->second, true};
  1698. }
  1699. GrowCapacity(flat_size_ + 1);
  1700. return Insert(key);
  1701. }
  1702. void ExtensionSet::GrowCapacity(size_t minimum_new_capacity) {
  1703. if (PROTOBUF_PREDICT_FALSE(is_large())) {
  1704. return; // LargeMap does not have a "reserve" method.
  1705. }
  1706. if (flat_capacity_ >= minimum_new_capacity) {
  1707. return;
  1708. }
  1709. const auto old_flat_capacity = flat_capacity_;
  1710. do {
  1711. flat_capacity_ = flat_capacity_ == 0 ? 1 : flat_capacity_ * 4;
  1712. } while (flat_capacity_ < minimum_new_capacity);
  1713. const KeyValue* begin = flat_begin();
  1714. const KeyValue* end = flat_end();
  1715. if (flat_capacity_ > kMaximumFlatCapacity) {
  1716. // Switch to LargeMap
  1717. map_.large = Arena::Create<LargeMap>(arena_);
  1718. LargeMap::iterator hint = map_.large->begin();
  1719. for (const KeyValue* it = begin; it != end; ++it) {
  1720. hint = map_.large->insert(hint, {it->first, it->second});
  1721. }
  1722. flat_size_ = 0;
  1723. } else {
  1724. map_.flat = Arena::CreateArray<KeyValue>(arena_, flat_capacity_);
  1725. std::copy(begin, end, map_.flat);
  1726. }
  1727. if (arena_ == nullptr) {
  1728. DeleteFlatMap(begin, old_flat_capacity);
  1729. }
  1730. }
  1731. // static
  1732. constexpr uint16 ExtensionSet::kMaximumFlatCapacity;
  1733. void ExtensionSet::Erase(int key) {
  1734. if (PROTOBUF_PREDICT_FALSE(is_large())) {
  1735. map_.large->erase(key);
  1736. return;
  1737. }
  1738. KeyValue* end = flat_end();
  1739. KeyValue* it =
  1740. std::lower_bound(flat_begin(), end, key, KeyValue::FirstComparator());
  1741. if (it != end && it->first == key) {
  1742. std::copy(it + 1, end, it);
  1743. --flat_size_;
  1744. }
  1745. }
  1746. // ==================================================================
  1747. // Default repeated field instances for iterator-compatible accessors
  1748. const RepeatedPrimitiveDefaults* RepeatedPrimitiveDefaults::default_instance() {
  1749. static auto instance = OnShutdownDelete(new RepeatedPrimitiveDefaults);
  1750. return instance;
  1751. }
  1752. const RepeatedStringTypeTraits::RepeatedFieldType*
  1753. RepeatedStringTypeTraits::GetDefaultRepeatedField() {
  1754. static auto instance = OnShutdownDelete(new RepeatedFieldType);
  1755. return instance;
  1756. }
  1757. uint8* ExtensionSet::Extension::InternalSerializeFieldWithCachedSizesToArray(
  1758. int number, uint8* target, io::EpsCopyOutputStream* stream) const {
  1759. if (is_repeated) {
  1760. if (is_packed) {
  1761. if (cached_size == 0) return target;
  1762. target = stream->EnsureSpace(target);
  1763. target = WireFormatLite::WriteTagToArray(
  1764. number, WireFormatLite::WIRETYPE_LENGTH_DELIMITED, target);
  1765. target = WireFormatLite::WriteInt32NoTagToArray(cached_size, target);
  1766. switch (real_type(type)) {
  1767. #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
  1768. case WireFormatLite::TYPE_##UPPERCASE: \
  1769. for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \
  1770. target = stream->EnsureSpace(target); \
  1771. target = WireFormatLite::Write##CAMELCASE##NoTagToArray( \
  1772. repeated_##LOWERCASE##_value->Get(i), target); \
  1773. } \
  1774. break
  1775. HANDLE_TYPE(INT32, Int32, int32);
  1776. HANDLE_TYPE(INT64, Int64, int64);
  1777. HANDLE_TYPE(UINT32, UInt32, uint32);
  1778. HANDLE_TYPE(UINT64, UInt64, uint64);
  1779. HANDLE_TYPE(SINT32, SInt32, int32);
  1780. HANDLE_TYPE(SINT64, SInt64, int64);
  1781. HANDLE_TYPE(FIXED32, Fixed32, uint32);
  1782. HANDLE_TYPE(FIXED64, Fixed64, uint64);
  1783. HANDLE_TYPE(SFIXED32, SFixed32, int32);
  1784. HANDLE_TYPE(SFIXED64, SFixed64, int64);
  1785. HANDLE_TYPE(FLOAT, Float, float);
  1786. HANDLE_TYPE(DOUBLE, Double, double);
  1787. HANDLE_TYPE(BOOL, Bool, bool);
  1788. HANDLE_TYPE(ENUM, Enum, enum);
  1789. #undef HANDLE_TYPE
  1790. case WireFormatLite::TYPE_STRING:
  1791. case WireFormatLite::TYPE_BYTES:
  1792. case WireFormatLite::TYPE_GROUP:
  1793. case WireFormatLite::TYPE_MESSAGE:
  1794. GOOGLE_LOG(FATAL) << "Non-primitive types can't be packed.";
  1795. break;
  1796. }
  1797. } else {
  1798. switch (real_type(type)) {
  1799. #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
  1800. case WireFormatLite::TYPE_##UPPERCASE: \
  1801. for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \
  1802. target = stream->EnsureSpace(target); \
  1803. target = WireFormatLite::Write##CAMELCASE##ToArray( \
  1804. number, repeated_##LOWERCASE##_value->Get(i), target); \
  1805. } \
  1806. break
  1807. HANDLE_TYPE(INT32, Int32, int32);
  1808. HANDLE_TYPE(INT64, Int64, int64);
  1809. HANDLE_TYPE(UINT32, UInt32, uint32);
  1810. HANDLE_TYPE(UINT64, UInt64, uint64);
  1811. HANDLE_TYPE(SINT32, SInt32, int32);
  1812. HANDLE_TYPE(SINT64, SInt64, int64);
  1813. HANDLE_TYPE(FIXED32, Fixed32, uint32);
  1814. HANDLE_TYPE(FIXED64, Fixed64, uint64);
  1815. HANDLE_TYPE(SFIXED32, SFixed32, int32);
  1816. HANDLE_TYPE(SFIXED64, SFixed64, int64);
  1817. HANDLE_TYPE(FLOAT, Float, float);
  1818. HANDLE_TYPE(DOUBLE, Double, double);
  1819. HANDLE_TYPE(BOOL, Bool, bool);
  1820. HANDLE_TYPE(ENUM, Enum, enum);
  1821. #undef HANDLE_TYPE
  1822. #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
  1823. case WireFormatLite::TYPE_##UPPERCASE: \
  1824. for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \
  1825. target = stream->EnsureSpace(target); \
  1826. target = stream->WriteString( \
  1827. number, repeated_##LOWERCASE##_value->Get(i), target); \
  1828. } \
  1829. break
  1830. HANDLE_TYPE(STRING, String, string);
  1831. HANDLE_TYPE(BYTES, Bytes, string);
  1832. #undef HANDLE_TYPE
  1833. #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
  1834. case WireFormatLite::TYPE_##UPPERCASE: \
  1835. for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \
  1836. target = stream->EnsureSpace(target); \
  1837. target = WireFormatLite::InternalWrite##CAMELCASE##ToArray( \
  1838. number, repeated_##LOWERCASE##_value->Get(i), target, stream); \
  1839. } \
  1840. break
  1841. HANDLE_TYPE(GROUP, Group, message);
  1842. HANDLE_TYPE(MESSAGE, Message, message);
  1843. #undef HANDLE_TYPE
  1844. }
  1845. }
  1846. } else if (!is_cleared) {
  1847. switch (real_type(type)) {
  1848. #define HANDLE_TYPE(UPPERCASE, CAMELCASE, VALUE) \
  1849. case WireFormatLite::TYPE_##UPPERCASE: \
  1850. target = stream->EnsureSpace(target); \
  1851. target = WireFormatLite::Write##CAMELCASE##ToArray(number, VALUE, target); \
  1852. break
  1853. HANDLE_TYPE(INT32, Int32, int32_value);
  1854. HANDLE_TYPE(INT64, Int64, int64_value);
  1855. HANDLE_TYPE(UINT32, UInt32, uint32_value);
  1856. HANDLE_TYPE(UINT64, UInt64, uint64_value);
  1857. HANDLE_TYPE(SINT32, SInt32, int32_value);
  1858. HANDLE_TYPE(SINT64, SInt64, int64_value);
  1859. HANDLE_TYPE(FIXED32, Fixed32, uint32_value);
  1860. HANDLE_TYPE(FIXED64, Fixed64, uint64_value);
  1861. HANDLE_TYPE(SFIXED32, SFixed32, int32_value);
  1862. HANDLE_TYPE(SFIXED64, SFixed64, int64_value);
  1863. HANDLE_TYPE(FLOAT, Float, float_value);
  1864. HANDLE_TYPE(DOUBLE, Double, double_value);
  1865. HANDLE_TYPE(BOOL, Bool, bool_value);
  1866. HANDLE_TYPE(ENUM, Enum, enum_value);
  1867. #undef HANDLE_TYPE
  1868. #define HANDLE_TYPE(UPPERCASE, CAMELCASE, VALUE) \
  1869. case WireFormatLite::TYPE_##UPPERCASE: \
  1870. target = stream->EnsureSpace(target); \
  1871. target = stream->WriteString(number, VALUE, target); \
  1872. break
  1873. HANDLE_TYPE(STRING, String, *string_value);
  1874. HANDLE_TYPE(BYTES, Bytes, *string_value);
  1875. #undef HANDLE_TYPE
  1876. case WireFormatLite::TYPE_GROUP:
  1877. target = stream->EnsureSpace(target);
  1878. target = WireFormatLite::InternalWriteGroupToArray(
  1879. number, *message_value, target, stream);
  1880. break;
  1881. case WireFormatLite::TYPE_MESSAGE:
  1882. if (is_lazy) {
  1883. target =
  1884. lazymessage_value->WriteMessageToArray(number, target, stream);
  1885. } else {
  1886. target = stream->EnsureSpace(target);
  1887. target = WireFormatLite::InternalWriteMessageToArray(
  1888. number, *message_value, target, stream);
  1889. }
  1890. break;
  1891. }
  1892. }
  1893. return target;
  1894. }
  1895. uint8*
  1896. ExtensionSet::Extension::InternalSerializeMessageSetItemWithCachedSizesToArray(
  1897. int number, uint8* target, io::EpsCopyOutputStream* stream) const {
  1898. if (type != WireFormatLite::TYPE_MESSAGE || is_repeated) {
  1899. // Not a valid MessageSet extension, but serialize it the normal way.
  1900. GOOGLE_LOG(WARNING) << "Invalid message set extension.";
  1901. return InternalSerializeFieldWithCachedSizesToArray(number, target, stream);
  1902. }
  1903. if (is_cleared) return target;
  1904. target = stream->EnsureSpace(target);
  1905. // Start group.
  1906. target = io::CodedOutputStream::WriteTagToArray(
  1907. WireFormatLite::kMessageSetItemStartTag, target);
  1908. // Write type ID.
  1909. target = WireFormatLite::WriteUInt32ToArray(
  1910. WireFormatLite::kMessageSetTypeIdNumber, number, target);
  1911. // Write message.
  1912. if (is_lazy) {
  1913. target = lazymessage_value->WriteMessageToArray(
  1914. WireFormatLite::kMessageSetMessageNumber, target, stream);
  1915. } else {
  1916. target = WireFormatLite::InternalWriteMessageToArray(
  1917. WireFormatLite::kMessageSetMessageNumber, *message_value, target,
  1918. stream);
  1919. }
  1920. // End group.
  1921. target = stream->EnsureSpace(target);
  1922. target = io::CodedOutputStream::WriteTagToArray(
  1923. WireFormatLite::kMessageSetItemEndTag, target);
  1924. return target;
  1925. }
  1926. size_t ExtensionSet::Extension::MessageSetItemByteSize(int number) const {
  1927. if (type != WireFormatLite::TYPE_MESSAGE || is_repeated) {
  1928. // Not a valid MessageSet extension, but compute the byte size for it the
  1929. // normal way.
  1930. return ByteSize(number);
  1931. }
  1932. if (is_cleared) return 0;
  1933. size_t our_size = WireFormatLite::kMessageSetItemTagsSize;
  1934. // type_id
  1935. our_size += io::CodedOutputStream::VarintSize32(number);
  1936. // message
  1937. size_t message_size = 0;
  1938. if (is_lazy) {
  1939. message_size = lazymessage_value->ByteSizeLong();
  1940. } else {
  1941. message_size = message_value->ByteSizeLong();
  1942. }
  1943. our_size += io::CodedOutputStream::VarintSize32(message_size);
  1944. our_size += message_size;
  1945. return our_size;
  1946. }
  1947. size_t ExtensionSet::MessageSetByteSize() const {
  1948. size_t total_size = 0;
  1949. ForEach([&total_size](int number, const Extension& ext) {
  1950. total_size += ext.MessageSetItemByteSize(number);
  1951. });
  1952. return total_size;
  1953. }
  1954. } // namespace internal
  1955. } // namespace protobuf
  1956. } // namespace google