I am also evaluating proto2 vs proto3 and even though it seems proto3 
should be the way to go I really miss the has_** functionality in proto3.

It seems the following proto pattern may be a workaround:

message M{
   oneof optional_value{
     int32 value = 1;
   }
}

It does generate value(), set_value(), clear_value() and has_value() 
methods (C++) but unfortunately the has_value is private.
Is there a reason such a useful and short method is declared private (it 
implementation only uses public functionality as well)



On Wednesday, February 11, 2015 at 3:55:03 PM UTC-5, Alfred Kwan wrote:
>
> Thanks for pointing me to "oneof". I gave it a try and I have two 
> questions:
> 1) I see the has_() being generated for all the fields inside oneof. Is 
> this kind of has_() function here to stay throughout subsequent V3 releases?
> 2) Since oneof does not allow a repeated field in both V2/3, is there 
> pro/cons in case I create one extra layer of structure i.e.:
> message manyMsg{ // workaround: wrap the repeating message
>    repeated oneMsg = 1;
> }
> message unionMsg{
>    oneof testOneof{
>       manyMsg msg = 1; // doesn't allow repeated
>       uint32 foo = 2;
>    }
> }
>
>
>
> On Sunday, February 8, 2015 at 11:01:04 PM UTC-5, Feng Xiao wrote:
>>
>> The union types are obsoleted by oneof:
>> https://developers.google.com/protocol-buffers/docs/proto#oneof
>>
>> On Sat, Feb 7, 2015 at 4:53 AM, Alfred Kwan <[email protected]> wrote:
>>
>>> To implement the has_boo() in 3.0 implies one boolean per each truly 
>>> optional field, which means additional maintenance is now required, e.g. 
>>> matching naming scheme for the pool together with the optional struct, also 
>>> should we group all booleans together or should they sit right next to the 
>>> to corresponding optional structures...
>>>
>>> With the uncertainty of how "any" replaces "extensions" plus the removal 
>>> of has_boo(), it seems like new adopters (I'm one of them) should pick V2 
>>> over 3.0.
>>>
>>> On Wednesday, January 28, 2015 at 3:10:39 PM UTC-5, Feng Xiao wrote:
>>>>
>>>>
>>>>
>>>> On Wed Jan 28 2015 at 12:06:21 PM Troy Lee <[email protected]> wrote:
>>>>
>>>>> Feng, 
>>>>>
>>>>> Version 3 removes presence logic. 
>>>>> How do we exam whether a field is exist or not?
>>>>>
>>>> This is no possible for singular primitive fields. For singular message 
>>>> fields, the has methods will still be generated. Basically with proto3 
>>>> you'll need to write your code without depending on these dropped 
>>>> features. 
>>>> It's believed that most users don't use the field presence logic much and 
>>>> for those who need this feature adding a bool field is an easy workaround.
>>>>  
>>>>
>>>>>
>>>>> Thanks,
>>>>> troylee
>>>>>
>>>>> Feng Xiao於 2014年12月11日星期四 UTC+8下午12時51分01秒寫道:
>>>>>
>>>>>> Hi all,
>>>>>>
>>>>>> I just published protobuf v3.0.0-alpha-1 on our github site:
>>>>>> https://github.com/google/protobuf/releases/tag/v3.0.0-alpha-1
>>>>>>
>>>>>> This is the first alpha release of protobuf v3.0.0. In protobuf 
>>>>>> v3.0.0, we will add a new protobuf language version (aka proto3) and 
>>>>>> support a wider range of programming languages (to name a few: ruby, 
>>>>>> php, 
>>>>>> node.js, objective-c). This alpha version contains C++ and Java 
>>>>>> implementation with partial proto3 support (see below for details). In 
>>>>>> future releases we will add support for more programming languages and 
>>>>>> implement the full proto3 feature set. Besides proto3, this alpha 
>>>>>> version 
>>>>>> also includes two other new features: map fields and arena allocation. 
>>>>>> They 
>>>>>> are implemented for both proto3 and the old protobuf language version 
>>>>>> (aka 
>>>>>> proto2).
>>>>>>
>>>>>> We are currently working on the documentation of these new features 
>>>>>> and when it's ready it will be updated to our protobuf developer 
>>>>>> guide <https://developers.google.com/protocol-buffers/docs/overview>. 
>>>>>> For the time being if you have any questions regarding proto3 or other 
>>>>>> new 
>>>>>> features, please post your question in the discussion group.
>>>>>>
>>>>>> CHANGS
>>>>>> =======
>>>>>> Version 3.0.0-alpha-1 (C++/Java):
>>>>>>
>>>>>>   General
>>>>>>   * Introduced Protocol Buffers language version 3 (aka proto3).
>>>>>>
>>>>>>     When protobuf was initially opensourced it implemented Protocol 
>>>>>> Buffers
>>>>>>     language version 2 (aka proto2), which is why the version number
>>>>>>     started from v2.0.0. From v3.0.0, a new language version (proto3) 
>>>>>> is
>>>>>>     introduced while the old version (proto2) will continue to be 
>>>>>> supported.
>>>>>>
>>>>>>     The main intent of introducing proto3 is to clean up protobuf 
>>>>>> before
>>>>>>     pushing the language as the foundation of Google's new API 
>>>>>> platform.
>>>>>>     In proto3, the language is simplified, both for ease of use and 
>>>>>>  to
>>>>>>     make it available in a wider range of programming languages. At 
>>>>>> the
>>>>>>     same time a few features are added to better support common idioms
>>>>>>     found in APIs.
>>>>>>
>>>>>>     The following are the main new features in language version 3:
>>>>>>
>>>>>>       1. Removal of field presence logic for primitive value fields, 
>>>>>> removal
>>>>>>          of required fields, and removal of default values. This 
>>>>>> makes proto3
>>>>>>          significantly easier to implement with open struct 
>>>>>> representations,
>>>>>>          as in languages like Android Java, Objective C, or Go.
>>>>>>       2. Removal of unknown fields.
>>>>>>       3. Removal of extensions, which are instead replaced by a new 
>>>>>> standard
>>>>>>          type called Any.
>>>>>>       4. Fix semantics for unknown enum values.
>>>>>>       5. Addition of maps.
>>>>>>       6. Addition of a small set of standard types for representation 
>>>>>> of time,
>>>>>>          dynamic data, etc.
>>>>>>       7. A well-defined encoding in JSON as an alternative to binary 
>>>>>> proto
>>>>>>          encoding.
>>>>>>
>>>>>>     This release (v3.0.0-alpha-1) includes partial proto3 support for 
>>>>>> C++ and
>>>>>>     Java. Items 6 (well-known types) and 7 (JSON format) in the above 
>>>>>> feature
>>>>>>     list are not implemented.
>>>>>>
>>>>>>     A new notion "syntax" is introduced to specify whether a .proto 
>>>>>> file
>>>>>>     uses proto2 or proto3:
>>>>>>
>>>>>>       // foo.proto
>>>>>>       syntax = "proto3";
>>>>>>       message Bar {...}
>>>>>>
>>>>>>     If omitted, the protocol compiler will generate a warning and 
>>>>>> "proto2" will
>>>>>>     be used as the default. This warning will be turned into an error 
>>>>>> in a
>>>>>>     future release.
>>>>>>
>>>>>>     We recommend that new Protocol Buffers users use proto3. However, 
>>>>>> we do not
>>>>>>     generally recommend that existing users migrate from proto2 from 
>>>>>> proto3 due
>>>>>>     to API incompatibility, and we will continue to support proto2 
>>>>>> for a long
>>>>>>     time.
>>>>>>
>>>>>>   * Added support for map fields (implemented in C++/Java for both 
>>>>>> proto2 and
>>>>>>     proto3).
>>>>>>
>>>>>>     Map fields can be declared using the following syntax:
>>>>>>
>>>>>>       message Foo {
>>>>>>         map<string, string> values = 1;
>>>>>>       }
>>>>>>
>>>>>>     Data of a map field will be stored in memory as an unordered map 
>>>>>> and it
>>>>>>     can be accessed through generated accessors.
>>>>>>
>>>>>>   C++
>>>>>>   * Added arena allocation support (for both proto2 and proto3).
>>>>>>
>>>>>>     Profiling shows memory allocation and deallocation constitutes a 
>>>>>> significant
>>>>>>     fraction of CPU-time spent in protobuf code and arena allocation 
>>>>>> is a
>>>>>>     technique introduced to reduce this cost. With arena allocation, 
>>>>>> new
>>>>>>     objects will be allocated from a large piece of preallocated 
>>>>>> memory and
>>>>>>     deallocation of these objects is almost free. Early adoption 
>>>>>> shows 20% to
>>>>>>     50% improvement in some Google binaries.
>>>>>>
>>>>>>     To enable arena support, add the following option to your .proto 
>>>>>> file:
>>>>>>
>>>>>>       option cc_enable_arenas = true;
>>>>>>
>>>>>>     Protocol compiler will generate additional code to make the 
>>>>>> generated
>>>>>>     message classes work with arenas. This does not change the 
>>>>>> existing API
>>>>>>     of protobuf messages and does not affect wire format. Your 
>>>>>> existing code
>>>>>>     should continue to work after adding this option. In the future 
>>>>>> we will
>>>>>>     make this option enabled by default.
>>>>>>
>>>>>>     To actually take advantage of arena allocation, you need to use 
>>>>>> the arena
>>>>>>     APIs when creating messages. A quick example of using the arena 
>>>>>> API:
>>>>>>
>>>>>>       {
>>>>>>         google::protobuf::Arena arena;
>>>>>>         // Allocate a protobuf message in the arena.
>>>>>>         MyMessage* message = Arena::CreateMessage<MyMessage>(&arena);
>>>>>>         // All submessages will be allocated in the same arena.
>>>>>>         if (!message->ParseFromString(data)) {
>>>>>>           // Deal with malformed input data.
>>>>>>         }
>>>>>>         // Must not delete the message here. It will be deleted 
>>>>>> automatically
>>>>>>         // when the arena is destroyed.
>>>>>>       }
>>>>>>
>>>>>>     Currently arena does not work with map fields. Enabling arena in 
>>>>>> a .proto
>>>>>>     file containing map fields will result in compile errors in the 
>>>>>> generated
>>>>>>     code. This will be addressed in a future release.
>>>>>> =======
>>>>>>
>>>>>> Thanks,
>>>>>> Feng
>>>>>>
>>>>>  -- 
>>>>> You received this message because you are subscribed to the Google 
>>>>> Groups "Protocol Buffers" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>>> an email to [email protected].
>>>>> To post to this group, send email to [email protected].
>>>>> Visit this group at http://groups.google.com/group/protobuf.
>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>
>>>>  -- 
>>> You received this message because you are subscribed to the Google 
>>> Groups "Protocol Buffers" group.
>>> To unsubscribe from this group and stop receiving emails from it, send 
>>> an email to [email protected].
>>> To post to this group, send email to [email protected].
>>> Visit this group at http://groups.google.com/group/protobuf.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/protobuf.
For more options, visit https://groups.google.com/d/optout.

Reply via email to