aboutsummaryrefslogtreecommitdiff
path: root/src/google/protobuf/unknown_field_set.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/google/protobuf/unknown_field_set.cc')
-rw-r--r--src/google/protobuf/unknown_field_set.cc40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/google/protobuf/unknown_field_set.cc b/src/google/protobuf/unknown_field_set.cc
index 6a9be5a4..f42f9a59 100644
--- a/src/google/protobuf/unknown_field_set.cc
+++ b/src/google/protobuf/unknown_field_set.cc
@@ -154,6 +154,46 @@ int UnknownFieldSet::SpaceUsed() const {
return sizeof(*this) + SpaceUsedExcludingSelf();
}
+UnknownFieldSet::Internal::FieldMap UnknownFieldSet::kEmptyMap;
+const UnknownFieldSet::iterator UnknownFieldSet::kEmptyIterator(
+ kEmptyMap.end(), &kEmptyMap);
+const UnknownFieldSet::const_iterator UnknownFieldSet::kEmptyConstIterator(
+ kEmptyMap.end(), &kEmptyMap);
+
+void UnknownFieldSet::iterator::AdvanceToNonEmpty() {
+ while (inner_iterator_ != inner_map_->end() &&
+ (inner_iterator_->second->index() == -1 ||
+ inner_iterator_->second->empty())) {
+ ++inner_iterator_;
+ }
+}
+
+void UnknownFieldSet::const_iterator::AdvanceToNonEmpty() {
+ while (inner_iterator_ != inner_map_->end() &&
+ (inner_iterator_->second->index() == -1 ||
+ inner_iterator_->second->empty())) {
+ ++inner_iterator_;
+ }
+}
+
+UnknownFieldSet::iterator UnknownFieldSet::begin() {
+ if (internal_ == NULL) return kEmptyIterator;
+
+ UnknownFieldSet::iterator result(internal_->fields_.begin(),
+ &internal_->fields_);
+ result.AdvanceToNonEmpty();
+ return result;
+}
+
+UnknownFieldSet::const_iterator UnknownFieldSet::begin() const {
+ if (internal_ == NULL) return kEmptyIterator;
+
+ UnknownFieldSet::const_iterator result(internal_->fields_.begin(),
+ &internal_->fields_);
+ result.AdvanceToNonEmpty();
+ return result;
+}
+
UnknownField::UnknownField(int number)
: number_(number),
index_(-1) {