----------------------
--- IMPORTANT TODO ---
----------------------
- ensure enums are int-size
- per comments on the main page: wire_format_inl.h is now
  wire_format_lite_inl.h .. adjust somehow .. possibly write an email
- rpc protocol should not hardcode method_index (although it's fine
  for API to do so)
- BUG? shouldn't enum..by_name[] and enum..by_number[] in the generated-code
  be static??
- dispatch-within-dispatch protection needed (ie assert that you can't
  recursively invoke the main-loop)
- uh not sure i like the hash-based situation for required values.
  perhaps we need a message-descriptor flag to help out. (Could always use
  different hashes and sizes)

--------------------
--- NEEDED TESTS ---
--------------------
- test:
  - service method lookups
  - out-of-order fields in messages (ie if the number isn't ascending)
  - gaps in numbers: check that the number of ranges is correct
  - default values
  - message unpack alloc failures when allocating new slab
  - message unpack alloc failures when allocating unknown field buffers
  - packed message corruption.
    - meta-todo: get a list of all the unpack errors together to check off
- run gcov

---------------------
--- DOCUMENTATION ---
---------------------
Document:
  - services
  - check over documentation again

--------------------------
--- LOW PRIORITY STUFF ---
--------------------------
- support Group (whatever it is)
- proper support for extensions
  - slot for ranges in descriptor
  - extends is implemented as c-style function
    whose name is built from the package, the base message type-name
    and the member.  which takes the base message and returns the
    value, if it is found in "unknown_values".
    boolean package__extension_member_name__get(Message *message,
                                                type     *out);
    void    package__extension_member_name__set_raw(type      in,
                                                ProtobufCUnknownValue *to_init);

------------------------------------
--- EXTREMELY LOW PRIORITY STUFF ---
------------------------------------
- stop using qsort in the code generator:  find some c++ish way to do it

----------------------------------------------
--- ISSUES WE ARE PROBABLY GOING TO IGNORE ---
----------------------------------------------
- strings may not contain NULs

-------------------------
--- IDEAS TO CONSIDER ---
-------------------------

- optimization: structures without repeated members could skip
  the ScannedMember phase

- optimization: a way to ignore unknown-fields when unpacking

- optimization: certain functions are not well setup for WORDSIZE==64;
  especially the int64 routines are inefficient that way.
  The best might be an internal #define WORDSIZE (sizeof(long)*8)"
  except w/ a real constant there, one that the preprocessor can use.
  I think the functions in protobuf-c.c are already tagged.

- lifetime functions for messages:
   message__new()
       return a new message using an allocator with standard allocation policy
   message__unpack_onto(...)
       unpack onto an initialized message
   message__clear(...)
       clears all allocations, does not free the message itself
   message__free(...)
       free the message.
  [yeah, right: after typing it out, i see it's way too complicated]

- switching to pure C.
  - Rewrite the code-generator in C, including the parser.
  - This would have the huge advantage that we could use ".proto" files
    directly, instead of having to invoke the compilers.
  - keep in a separate c file for static linking optimziation purposes
  - need alignment tests
  - the CAVEATS should discuss our structure-packing assumptions
