diff options
author | kenton@google.com <kenton@google.com@630680e5-0e50-0410-840e-4b1c322b438d> | 2009-06-25 19:05:36 +0000 |
---|---|---|
committer | kenton@google.com <kenton@google.com@630680e5-0e50-0410-840e-4b1c322b438d> | 2009-06-25 19:05:36 +0000 |
commit | ceb561d65bfe234a301979a7e3f7ddc244d349b3 (patch) | |
tree | 8b86ec6fda6f7bcce0f214940dcaea5fb73c7d9f /src/google/protobuf/extension_set.cc | |
parent | f22943c7d0ce19b35a1e3d7f33c8ede3b6fed485 (diff) | |
download | protobuf-ceb561d65bfe234a301979a7e3f7ddc244d349b3.tar.gz protobuf-ceb561d65bfe234a301979a7e3f7ddc244d349b3.tar.bz2 protobuf-ceb561d65bfe234a301979a7e3f7ddc244d349b3.zip |
Add Swap(), SwapElements(), and RemoveLast() to Reflection. Patch by Scott Stafford.
Diffstat (limited to 'src/google/protobuf/extension_set.cc')
-rw-r--r-- | src/google/protobuf/extension_set.cc | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/src/google/protobuf/extension_set.cc b/src/google/protobuf/extension_set.cc index f45eafa5..61b8daae 100644 --- a/src/google/protobuf/extension_set.cc +++ b/src/google/protobuf/extension_set.cc @@ -497,6 +497,88 @@ Message* ExtensionSet::AddMessage(int number, FieldType type, #undef GOOGLE_DCHECK_TYPE +void ExtensionSet::RemoveLast(int number) { + map<int, Extension>::iterator iter = extensions_.find(number); + GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; + + Extension* extension = &iter->second; + GOOGLE_DCHECK(extension->is_repeated); + + switch(cpp_type(extension->type)) { + case FieldDescriptor::CPPTYPE_INT32: + extension->repeated_int32_value->RemoveLast(); + break; + case FieldDescriptor::CPPTYPE_INT64: + extension->repeated_int64_value->RemoveLast(); + break; + case FieldDescriptor::CPPTYPE_UINT32: + extension->repeated_uint32_value->RemoveLast(); + break; + case FieldDescriptor::CPPTYPE_UINT64: + extension->repeated_uint64_value->RemoveLast(); + break; + case FieldDescriptor::CPPTYPE_FLOAT: + extension->repeated_float_value->RemoveLast(); + break; + case FieldDescriptor::CPPTYPE_DOUBLE: + extension->repeated_double_value->RemoveLast(); + break; + case FieldDescriptor::CPPTYPE_BOOL: + extension->repeated_bool_value->RemoveLast(); + break; + case FieldDescriptor::CPPTYPE_ENUM: + extension->repeated_enum_value->RemoveLast(); + break; + case FieldDescriptor::CPPTYPE_STRING: + extension->repeated_string_value->RemoveLast(); + break; + case FieldDescriptor::CPPTYPE_MESSAGE: + extension->repeated_message_value->RemoveLast(); + break; + } +} + +void ExtensionSet::SwapElements(int number, int index1, int index2) { + map<int, Extension>::iterator iter = extensions_.find(number); + GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; + + Extension* extension = &iter->second; + GOOGLE_DCHECK(extension->is_repeated); + + switch(cpp_type(extension->type)) { + case FieldDescriptor::CPPTYPE_INT32: + extension->repeated_int32_value->SwapElements(index1, index2); + break; + case FieldDescriptor::CPPTYPE_INT64: + extension->repeated_int64_value->SwapElements(index1, index2); + break; + case FieldDescriptor::CPPTYPE_UINT32: + extension->repeated_uint32_value->SwapElements(index1, index2); + break; + case FieldDescriptor::CPPTYPE_UINT64: + extension->repeated_uint64_value->SwapElements(index1, index2); + break; + case FieldDescriptor::CPPTYPE_FLOAT: + extension->repeated_float_value->SwapElements(index1, index2); + break; + case FieldDescriptor::CPPTYPE_DOUBLE: + extension->repeated_double_value->SwapElements(index1, index2); + break; + case FieldDescriptor::CPPTYPE_BOOL: + extension->repeated_bool_value->SwapElements(index1, index2); + break; + case FieldDescriptor::CPPTYPE_ENUM: + extension->repeated_enum_value->SwapElements(index1, index2); + break; + case FieldDescriptor::CPPTYPE_STRING: + extension->repeated_string_value->SwapElements(index1, index2); + break; + case FieldDescriptor::CPPTYPE_MESSAGE: + extension->repeated_message_value->SwapElements(index1, index2); + break; + } +} + // =================================================================== void ExtensionSet::Clear() { |