33 #ifndef GOOGLE_PROTOBUF_REFLECTION_H__ 34 #define GOOGLE_PROTOBUF_REFLECTION_H__ 47 template<
typename T,
typename Enable =
void>
66 T, typename
internal::enable_if<!internal::is_base_of<Message, T>::value>
::type> {
72 return accessor_->IsEmpty(data_);
75 return accessor_->Size(data_);
78 return accessor_->template Get<T>(data_,
index);
84 return iterator(data_, accessor_,
true);
86 iterator
end()
const {
87 return iterator(data_, accessor_,
false);
97 const_cast<Message*>(&message), field,
99 accessor_ = reflection->RepeatedFieldAccessor(field);
103 const AccessorType* accessor_;
109 T, typename
internal::enable_if<!internal::is_base_of<Message, T>::value>
::type> {
114 return accessor_->IsEmpty(data_);
117 return accessor_->Size(data_);
120 return accessor_->template Get<T>(data_,
index);
124 accessor_->template Set<T>(data_,
index,
value);
127 accessor_->template Add<T>(data_,
value);
130 accessor_->RemoveLast(data_);
133 accessor_->SwapElements(data_, index1, index2);
136 accessor_->Clear(data_);
140 accessor_->Swap(data_, other.accessor_, other.data_);
143 template<
typename Container>
145 typedef typename Container::const_iterator
Iterator;
146 for (Iterator it = container.begin(); it != container.end(); ++it) {
150 template<
typename Container>
164 accessor_ = reflection->RepeatedFieldAccessor(field);
168 const AccessorType* accessor_;
174 T, typename
internal::enable_if<internal::is_base_of<Message, T>::value>
::type> {
180 return accessor_->IsEmpty(data_);
183 return accessor_->Size(data_);
195 return *
static_cast<const T*
>(accessor_->Get(data_, index, scratch_space));
200 return static_cast<T*
>(default_instance_->New());
206 return iterator(data_, accessor_,
true, NewMessage());
209 return iterator(data_, accessor_,
false, NewMessage());
219 const_cast<Message*>(&message), field,
222 accessor_ = reflection->RepeatedFieldAccessor(field);
228 const AccessorType* accessor_;
229 const Message* default_instance_;
235 T, typename
internal::enable_if<internal::is_base_of<Message, T>::value>
::type> {
240 return accessor_->IsEmpty(data_);
243 return accessor_->Size(data_);
247 return *
static_cast<const T*
>(accessor_->Get(data_, index, scratch_space));
252 return static_cast<T*
>(default_instance_->New());
256 accessor_->Set(data_, index, &value);
259 accessor_->Add(data_, &value);
262 accessor_->RemoveLast(data_);
265 accessor_->SwapElements(data_, index1, index2);
268 accessor_->Clear(data_);
272 accessor_->Swap(data_, other.accessor_, other.data_);
275 template<
typename Container>
277 typedef typename Container::const_iterator
Iterator;
278 for (Iterator it = container.begin(); it != container.end(); ++it) {
282 template<
typename Container>
297 accessor_ = reflection->RepeatedFieldAccessor(field);
303 const AccessorType* accessor_;
304 const Message* default_instance_;
341 virtual bool IsEmpty(
const Field*
data)
const = 0;
342 virtual int Size(
const Field*
data)
const = 0;
348 virtual const Value*
Get(
349 const Field*
data,
int index, Value* scratch_space)
const = 0;
351 virtual void Clear(Field*
data)
const = 0;
352 virtual void Set(Field*
data,
int index,
const Value*
value)
const = 0;
353 virtual void Add(Field*
data,
const Value*
value)
const = 0;
354 virtual void RemoveLast(Field*
data)
const = 0;
355 virtual void SwapElements(Field*
data,
int index1,
int index2)
const = 0;
357 Field* other_data)
const = 0;
360 virtual Iterator* BeginIterator(
const Field*
data)
const = 0;
362 virtual Iterator* EndIterator(
const Field*
data)
const = 0;
364 virtual Iterator* CopyIterator(
const Field*
data,
365 const Iterator* iterator)
const = 0;
367 virtual Iterator* AdvanceIterator(
const Field*
data,
368 Iterator* iterator)
const = 0;
370 virtual bool EqualsIterator(
const Field*
data,
const Iterator*
a,
371 const Iterator*
b)
const = 0;
374 virtual void DeleteIterator(
const Field*
data, Iterator* iterator)
const = 0;
376 virtual const Value* GetIteratorValue(
const Field*
data,
377 const Iterator* iterator,
378 Value* scratch_space)
const = 0;
385 ActualType scratch_space;
386 return static_cast<T>(
387 *
reinterpret_cast<const ActualType*
>(
388 Get(data, index, static_cast<Value*>(&scratch_space))));
391 template<
typename T,
typename ValueType>
401 ActualType tmp =
static_cast<ActualType
>(
value);
402 Set(data, index, static_cast<const Value*>(&tmp));
405 template<
typename T,
typename ValueType>
415 ActualType tmp =
static_cast<ActualType
>(
value);
416 Add(data, static_cast<const Value*>(&tmp));
423 :
public std::iterator<std::forward_iterator_tag, T> {
433 : data_(data), accessor_(accessor),
434 iterator_(begin ? accessor->BeginIterator(data) :
435 accessor->EndIterator(data)),
436 scratch_space_(
new AccessorValueType) {
442 AccessorValueType* scratch_space)
443 : data_(data), accessor_(accessor),
444 iterator_(begin ? accessor->BeginIterator(data) :
445 accessor->EndIterator(data)),
446 scratch_space_(scratch_space) {
449 accessor_->DeleteIterator(data_, iterator_);
453 iterator_ = accessor_->AdvanceIterator(data_, iterator_);
457 iterator_ = accessor_->AdvanceIterator(data_, iterator_);
461 return static_cast<IteratorValueType
>(
462 *
static_cast<const AccessorValueType*
>(
463 accessor_->GetIteratorValue(
464 data_, iterator_, scratch_space_.get())));
467 return static_cast<IteratorPointerType
>(
468 accessor_->GetIteratorValue(
469 data_, iterator_, scratch_space_.get()));
472 assert(data_ == other.
data_);
474 return !accessor_->EqualsIterator(data_, iterator_, other.
iterator_);
481 : data_(other.data_), accessor_(other.accessor_),
482 iterator_(accessor_->CopyIterator(data_, other.iterator_)) {
485 if (
this != &other) {
486 accessor_->DeleteIterator(data_, iterator_);
506 static const bool is_primitive =
false;
508 #define DEFINE_PRIMITIVE(TYPE, type) \ 509 template<> struct PrimitiveTraits<type> { \ 510 static const bool is_primitive = true; \ 511 static const FieldDescriptor::CppType cpp_type = \ 512 FieldDescriptor::CPPTYPE_ ## TYPE; \ 521 #undef DEFINE_PRIMITIVE 572 return T::default_instance().GetDescriptor();
600 #endif // GOOGLE_PROTOBUF_REFLECTION_H__ T Get(int index) const
Definition: reflection.h:77
void Add(Field *data, const ValueType &value) const
Definition: reflection.h:406
void Set(Field *data, int index, const ValueType &value) const
Definition: reflection.h:392
Definition: message.h:179
Iterator
Definition: six.py:544
void RemoveLast() const
Definition: reflection.h:261
IteratorValueType operator*() const
Definition: reflection.h:460
const FieldDescriptor * field
Definition: parser_unittest.cc:2279
void CopyFrom(const Container &container) const
Definition: reflection.h:283
virtual const Message * GetPrototype(const Descriptor *type)=0
const T & IteratorValueType
Definition: reflection.h:588
Definition: reflection.h:505
RepeatedFieldAccessor AccessorType
Definition: reflection.h:527
Definition: message.h:401
#define DEFINE_PRIMITIVE(TYPE, type)
Definition: reflection.h:508
void Set(int index, const T &value) const
Definition: reflection.h:123
iterator end() const
Definition: reflection.h:208
int size() const
Definition: reflection.h:242
RepeatedFieldRefIterator & operator++()
Definition: reflection.h:456
void MergeFrom(const Container &container) const
Definition: reflection.h:276
CppType
Definition: descriptor.h:475
iterator end() const
Definition: reflection.h:86
T * NewMessage() const
Definition: reflection.h:251
Definition: descriptor.h:483
void CopyFrom(const Container &container) const
Definition: reflection.h:151
Definition: reflection.h:570
void Add(const T &value) const
Definition: reflection.h:126
Definition: descriptor.h:484
static const Descriptor * GetMessageFieldDescriptor()
Definition: reflection.h:533
static const Descriptor * GetMessageFieldDescriptor()
Definition: reflection.h:549
void Clear() const
Definition: reflection.h:135
Definition: descriptor.h:172
void RemoveLast() const
Definition: reflection.h:129
iterator begin() const
Definition: reflection.h:205
void Iterator
Definition: reflection.h:338
T * IteratorPointerType
Definition: reflection.h:530
virtual const Reflection * GetReflection() const
Definition: message.h:331
MutableRepeatedFieldRef< T > GetMutableRepeatedFieldRef(Message *message, const FieldDescriptor *field) const
Definition: reflection.h:58
Definition: message.h:355
Definition: message.h:358
int size() const
Definition: reflection.h:116
IteratorType iterator
Definition: reflection.h:81
RepeatedFieldRef< T > GetRepeatedFieldRef(const Message &message, const FieldDescriptor *field) const
Definition: reflection.h:52
RepeatedFieldAccessor AccessorType
Definition: reflection.h:586
bool operator!=(const RepeatedFieldRefIterator &other) const
Definition: reflection.h:471
Definition: descriptor.h:439
RepeatedFieldAccessor AccessorType
Definition: reflection.h:558
uint64_t uint64
Definition: angle_config.h:30
int64_t int64
Definition: angle_config.h:29
T * NewMessage() const
Definition: reflection.h:199
iterator begin() const
Definition: reflection.h:83
void * iterator_
Definition: reflection.h:497
const FieldDescriptor const OneofDescriptor value
Definition: descriptor.h:1717
int32_t int32
Definition: port.h:130
void MergeFrom(const Container &container) const
Definition: reflection.h:144
bool empty() const
Definition: reflection.h:179
int32 * IteratorPointerType
Definition: reflection.h:546
void Swap(const MutableRepeatedFieldRef &other) const
Definition: reflection.h:271
TestSubObjConstructor T
Definition: TestTypedefs.idl:84
void Field
Definition: reflection.h:336
RepeatedFieldRefIterator< T > iterator
Definition: reflection.h:526
void Add(const T &value) const
Definition: reflection.h:258
Definition: descriptor.h:485
~RepeatedFieldRefIterator()
Definition: reflection.h:448
GLuint index
Definition: gl2.h:383
EGLAttrib * value
Definition: eglext.h:120
ValueType
Definition: WebKitPluginHostTypes.h:51
const T * IteratorPointerType
Definition: reflection.h:589
RepeatedFieldRefIterator(const void *data, const RepeatedFieldAccessor *accessor, bool begin)
Definition: reflection.h:430
const T & Get(int index, T *scratch_space) const
Definition: reflection.h:194
IteratorType const_iterator
Definition: reflection.h:204
void Set(int index, const T &value) const
Definition: reflection.h:255
unrestricted float DOUBLE
Definition: TestTypedefs.idl:71
Definition: __init__.py:1
RepeatedFieldRefIterator< T > iterator
Definition: reflection.h:585
string * IteratorPointerType
Definition: reflection.h:561
T IteratorValueType
Definition: reflection.h:545
GLboolean GLboolean GLboolean GLboolean a
Definition: gl2ext.h:306
IteratorType const_iterator
Definition: reflection.h:82
static const Descriptor * GetMessageFieldDescriptor()
Definition: reflection.h:592
Definition: type_traits.h:88
bool operator==(const RepeatedFieldRefIterator &other) const
Definition: reflection.h:476
IteratorPointerType operator->() const
Definition: reflection.h:466
RepeatedFieldRefIterator(const void *data, const RepeatedFieldAccessor *accessor, bool begin, AccessorValueType *scratch_space)
Definition: reflection.h:439
google::protobuf::scoped_ptr< AccessorValueType > scratch_space_
Definition: reflection.h:498
string AccessorValueType
Definition: reflection.h:559
const void * data_
Definition: reflection.h:495
void Value
Definition: reflection.h:337
static const Descriptor * get()
Definition: reflection.h:571
virtual MessageFactory * GetMessageFactory() const
Definition: message.cc:410
void Swap(const MutableRepeatedFieldRef &other) const
Definition: reflection.h:139
int size() const
Definition: reflection.h:74
EGLenum type
Definition: eglext.h:63
Definition: scoped_ptr.h:48
EGLStreamKHR EGLint EGLint EGLint const void * data
Definition: eglext.h:984
T Get(int index) const
Definition: reflection.h:119
Definition: document.h:393
int size() const
Definition: reflection.h:182
T AccessorValueType
Definition: reflection.h:528
string IteratorValueType
Definition: reflection.h:560
bool empty() const
Definition: reflection.h:113
Definition: reflection.h:333
FieldDescriptor::CppType cpp_type(FieldType type)
Definition: extension_set_heavy.cc:128
#define NULL
Definition: common_types.h:41
RepeatedFieldRefIterator & operator=(const RepeatedFieldRefIterator &other)
Definition: reflection.h:484
static const Descriptor * GetMessageFieldDescriptor()
Definition: reflection.h:564
T IteratorValueType
Definition: reflection.h:529
RepeatedFieldRefIterator< T > iterator
Definition: reflection.h:541
#define LIBPROTOBUF_EXPORT
Definition: port.h:97
uint32_t uint32
Definition: angle_config.h:28
GLboolean GLboolean GLboolean b
Definition: gl2ext.h:306
virtual Iterator * CopyIterator(const Field *data, const Iterator *iterator) const =0
virtual void * RepeatedFieldData(Message *message, const FieldDescriptor *field, FieldDescriptor::CppType cpp_type, const Descriptor *message_type) const
Definition: message.cc:415
Definition: gflags_completions.h:115
int32 AccessorValueType
Definition: reflection.h:544
bool empty() const
Definition: reflection.h:71
void SwapElements(int index1, int index2) const
Definition: reflection.h:132
const T & Get(int index, T *scratch_space) const
Definition: reflection.h:246
RepeatedFieldRefIterator(const RepeatedFieldRefIterator &other)
Definition: reflection.h:480
const RepeatedFieldAccessor * accessor_
Definition: reflection.h:496
RepeatedFieldRefIterator< T > iterator
Definition: reflection.h:557
void Clear() const
Definition: reflection.h:267
bool operator!=(const uint128 &lhs, const uint128 &rhs)
Definition: int128.h:140
RepeatedFieldAccessor AccessorType
Definition: reflection.h:542
RepeatedFieldRefIterator operator++(int)
Definition: reflection.h:451
GLuint GLsizei const GLchar * message
Definition: gl2ext.h:137
const Descriptor * message_type() const
Definition: reflection.h:422
Definition: GetPutInfo.h:232
Definition: reflection.h:48
Message AccessorValueType
Definition: reflection.h:587
MergeFrom
Definition: python_message.py:1259
int32_t int32
Definition: angle_config.h:27
bool empty() const
Definition: reflection.h:239
T Get(const Field *data, int index) const
Definition: reflection.h:383
void SwapElements(int index1, int index2) const
Definition: reflection.h:264
IteratorType iterator
Definition: reflection.h:203