On Tue, Feb 16, 2010 at 2:47 PM, Romain Francois < romain.francois.r.enthusi...@gmail.com> wrote:
> Thanks for the feedback. > > > On 02/16/2010 10:44 PM, Kenton Varda wrote: > >> GeneratedMessageReflection is an internal class used by the protobuf >> implementation. Currently, users are not allowed to use it directly, >> because we may change it at any time. You're suggesting that we promote >> it to a public interface, which has implications with regard to >> maintenance costs and implementation agility. >> > > I understand that. > > I'm not necessarily suggesting to make this particular class public, but am > looking for some way to iterate over the elements of a repeated field. > The Reflection interface already provides a way -- FieldSize() and GetRepeatedX(). The only problem is that it's a bit slower than the generated accessors because these methods aren't inlineable. BTW, have you observed an actual performance problem or are you just speculating that this performance difference may be a problem for you? > On the same score, if I want to increase the number of elements in a > repeated field, I have to do it one by one right ? I can't do something like > first reserve space, and then fill the generated space. Does that mean that > memory is reallocated each time ? No, adding an element is O(1), even if you haven't reserved space. It works the same way std::vector works. > > What you would really need to >> use is dynamic_cast. My golden rule of dynamic_cast is that it should >> only be used for optimization, and you must provide an implementation >> for the case where dynamic_cast always returns NULL. >> > > But dynamic_cast is a runtime thing, where TMP dispatch happens at compile > time. > GetReflection() returns Reflection*, NOT GeneratedMessageReflection*. Therefore the compile has no idea which type was returned, therefore you *must* use a runtime check. That's my point -- your template dispatch doesn't accomplish anything in this context. > > In your case, you >> are doing this, so that should be fine. >> >> On Sat, Feb 13, 2010 at 1:16 AM, Romain Francois >> <romain.francois.r.enthusi...@gmail.com >> <mailto:romain.francois.r.enthusi...@gmail.com>> wrote: >> >> Hello, >> >> Thanks for the answers. >> >> Maybe I should give some more background on why this is of interest >> to me. In RProtoBuf, we essentially only use the reflection api so >> that we can dynamically load new proto message types at runtime, etc >> ... we don't use protoc and therefore have no access to the >> generated classes. >> >> In the class "GeneratedMessageReflection", there are templates such as >> : >> >> template <typename Type> >> inline Type GetRepeatedField(const Message& message, >> const FieldDescriptor* field, >> int index) const; >> >> but they are private ? Why ? >> >> >From what I can read of the code, methods like GetRepeatedInt32 >> get expanded out of : >> >> PASSTYPE GeneratedMessageReflection::GetRepeated##TYPENAME( >> \ >> const Message& message, \ >> const FieldDescriptor* field, int index) const { \ >> USAGE_CHECK_ALL(GetRepeated##TYPENAME, REPEATED, CPPTYPE); \ >> if (field->is_extension()) { \ >> return GetExtensionSet(message).GetRepeated##TYPENAME( \ >> field->number(), index); \ >> } else { \ >> return GetRepeatedField<TYPE>(message, field, index); \ >> } \ >> } \ >> >> so doing things like this code >> >> >> for( int i=0; i<size; i++){ >> INTEGER(res)[i] = (int) ref->GetRepeatedInt32( >> *message, >> fieldDesc, >> i ) ; >> } >> >> is going to be not as efficient as if I could directly iterate over >> the repeated field using RepeatedField::iterator >> >> Instead of extending the Reflection interface, what about making the >> templates public in GeneratedMessageReflection and then maybe use >> some sort of trait to indicate whether that the instance of >> Reflection I have access to has these templates. >> >> >> Something like : >> >> >> template <typename _T, _T _V> struct integral_constant { >> static const _T value = _V; >> typedef _T value_type; >> typedef integral_constant<_T,_V> type; >> }; >> typedef integral_constant<bool, true> true_type; >> typedef integral_constant<bool, false> false_type; >> >> struct reflection_has_templates{} ; >> struct reflection_no_templates{} ; >> >> template <typename T> struct has_templates : public false_type{}; >> template<> struct has_templates<GeneratedMessageReflection> : public >> true_type{} ; >> >> So that using this trait, I can dispatch between : >> - suboptimal implementation when the templates are not there >> - optimal implementation using RepeatedField::iterator when they are >> available. >> >> It adds nothing to the Reflection interface. >> >> Romain >> >> >> >> On 02/12/2010 10:37 PM, Kenton Varda wrote: >> >> Yeah, it would add a lot of complication and reduce the >> flexibility of >> the Reflection interface. We don't want to require repeated >> fields to >> be implemented in terms of RepeatedField or RepeatedPtrField. >> >> On Fri, Feb 12, 2010 at 12:11 PM, Jason Hsueh <jas...@google.com >> <mailto:jas...@google.com> >> <mailto:jas...@google.com <mailto:jas...@google.com>>> wrote: >> >> +kenton >> >> Kenton may have a better answer, but I surmise that it's to >> avoid >> tying the Reflection interface to implementation details. A >> Message >> implementation might not use RepeatedField at all. The original >> version of protobufs used a different class to represent >> repeated >> fields, so it wouldn't have been possible to implement >> Reflection >> for the original version if the interface required access to >> RepeatedField. So maybe the reason is historical. Recent >> changes >> have been made that would make this technically possible. >> However, >> adding methods to get direct access to the RepeatedField >> would still >> expand the Reflection interface quite a bit. I'll defer to >> Kenton on >> that. >> >> On Fri, Feb 12, 2010 at 2:51 AM, Romain Francois >> <romain.francois.r.enthusi...@gmail.com >> <mailto:romain.francois.r.enthusi...@gmail.com> >> <mailto:romain.francois.r.enthusi...@gmail.com >> <mailto:romain.francois.r.enthusi...@gmail.com>>> wrote: >> >> >> Why not ? It seems reasonnable to want to use e.g. >> std::copy and >> friends. >> >> On the documentation it says : >> >> " >> Most users will not ever use a RepeatedField directly; >> they will >> use the get-by-index, set-by-index, and add accessors >> that are >> generated for all repeated fields >> " >> >> What if I do want to use RepeatedField ? >> >> Romain >> >> >> On 02/11/2010 06:50 PM, Jason Hsueh wrote: >> >> No, there isn't a way to get the RepeatedField from the >> reflection >> interface. You can only do so via the generated >> interface. >> >> On Thu, Feb 11, 2010 at 5:57 AM, Romain Francois >> <romain.francois.r.enthusi...@gmail.com >> <mailto:romain.francois.r.enthusi...@gmail.com> >> <mailto:romain.francois.r.enthusi...@gmail.com >> <mailto:romain.francois.r.enthusi...@gmail.com>> >> <mailto:romain.francois.r.enthusi...@gmail.com >> <mailto:romain.francois.r.enthusi...@gmail.com> >> <mailto:romain.francois.r.enthusi...@gmail.com >> <mailto:romain.francois.r.enthusi...@gmail.com>>>> wrote: >> >> Hello, >> >> How can I get hold of a RepeatedField object to >> manage a >> repeated >> field in C++. >> >> In RProtoBuf, we do a lot of : >> >> for( int i=0; i<size; i++){ >> INTEGER(res)[i] = (int) ref->GetRepeatedInt32( >> *message, >> fieldDesc, >> i ) ; >> } >> >> where essentially the INTEGER macro gives a >> pointer to >> the beginning >> of the int array we are filling. >> >> I'd like to replace this using e.g std::copy >> >> RepeatedField field ; >> std::copy( field.begin(), field.end(), >> INTEGER(res) ) ; >> >> but I can't find how to actually get hold of a >> RepeatedField object. >> >> Is it possible ? >> >> Romain >> >> >> -- >> Romain Francois >> Professional R Enthusiast >> +33(0) 6 28 91 30 30 >> http://romainfrancois.blog.free.fr >> |- http://tr.im/NrTG : Rcpp 0.7.5 >> |- http://tr.im/MPYc : RProtoBuf: protocol buffers for R >> `- http://tr.im/KfKn : Rcpp 0.7.2 >> >> >> > > -- > Romain Francois > Professional R Enthusiast > +33(0) 6 28 91 30 30 > http://romainfrancois.blog.free.fr > |- http://tr.im/OcQe : Rcpp 0.7.7 > |- http://tr.im/O1wO : highlight 0.1-5 > `- http://tr.im/O1qJ : Rcpp 0.7.6 > > -- You received this message because you are subscribed to the Google Groups "Protocol Buffers" group. To post to this group, send email to proto...@googlegroups.com. To unsubscribe from this group, send email to protobuf+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/protobuf?hl=en.