extension_set.cc 72 KB

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