// EXPERIMENTAL. DO NOT USE.
// For "map" fields, the name of the field in the enclosed type that
// is the key for this map. For example, suppose we have:
// message Item {
// required string name = 1;
// required string value = 2;
// }
// message Config {
// repeated Item items = 1 [experimental_map_key="name"];
// }
// In this situation, the map key for Item will be set to "name".
// TODO: Fully-implement this, then remove the "experimental_" prefix.
optional string experimental_map_key = 9;
Interesting. It basically pins a field within repeated object to be the key.
I like that. That's very aligned with my ideas. This allows other key types
fairly easily. I guess it would make sense to support string, int and enum
by default. I like the syntax I described better though. :)
On Wed, Oct 6, 2010 at 12:07 PM, David Yu <[email protected]> wrote:
> In descriptor.proto, you'll see an experimental map field. It's not usable
> atm.
> In the meantime, you could always simulate a map serialization using a
> repeated message with
> odd field numbers as $key and even as $value (sequential).
>
> On Wed, Oct 6, 2010 at 2:23 PM, Igor Gatis <[email protected]> wrote:
>
>> Not sure whether this has been discussed before. In any case...
>>
>> It would be nice to have mapped fields, e.g. key-value pairs. It would
>> work similar to repeated fields, which are implicit maps, e.g 0..N keyed
>> messages. Mapped fields would break from 0..N keys to int or string keys.
>> Integers are very compact and that is very attractive in terms of wire
>> format but settle with integer keys are not really greater than 0..N keys.
>> Thus, string seems more suitable keys of mapped fields. Thus, it seems each
>> item of a mapped field could be defined by the following template-like proto
>> message:
>>
>> message KeyValuePair_of_SomeMessageType {
>> required string key = 1;
>> optional SomeMessageType value = 2;
>> }
>>
>>
>> Let's pick a example. Consider the following messages:
>>
>> message Foo {
>> optional int int_field = 1;
>> ...
>> }
>>
>> message Bar {
>> mapped Foo foo = 1;
>> }
>>
>> Internally, protobuf would read the above code as something like:
>>
>> message Foo {
>> optional int int_field = 1;
>> ...
>> }
>>
>> // Known in code generation time only.
>> message KeyValuePair_of_Foo {
>> required string key = 1;
>> optional Foo value = 2;
>> }
>>
>> message Bar {
>> repeated KeyValuePair_of_Foo foo = 1;
>> }
>>
>>
>> And generated C++ code for Bar would look like:
>>
>> int32 foo_size() const;
>> bool has_foo(const string& key) const;
>> const Foo& foo(const string& key) const;
>> Foo* mutable_foo(const string& key);
>> void put_foo(const string& key, const Foo& foo);
>> void remove_foo(const string& key);
>> const RepeatedPtrField<string>& foo_keys() const;
>> const RepeatedPtrField<const Foo&>& foo_values() const;
>>
>>
>> Thoughts?
>>
>> -Gatis
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Protocol Buffers" group.
>> To post to this group, send email to [email protected].
>> To unsubscribe from this group, send email to
>> [email protected]<protobuf%[email protected]>
>> .
>> For more options, visit this group at
>> http://groups.google.com/group/protobuf?hl=en.
>>
>
>
>
> --
> When the cat is away, the mouse is alone.
> - David Yu
>
--
You received this message because you are subscribed to the Google Groups
"Protocol Buffers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/protobuf?hl=en.