Listing 5

class Mgt
{
  private:
    const unsigned char * data;
    mutable size_t tables_index_x;
    mutable size_t tables_byte_offset_x;
    mutable size_t tables_num_bits_x;
    mutable size_t descriptors_index_x;
    mutable size_t descriptors_byte_offset_x;
    mutable size_t descriptors_num_elts_x;
  public:
    Mgt (const unsigned char *_data):
        data (_data),
        tables_index_x (0),
        tables_byte_offset_x (0),
        tables_num_bits_x (0),
        descriptors_index_x (0),
        descriptors_byte_offset_x (0),
        descriptors_num_elts_x (0)
    {
    };
    size_t tableId (void) const
    {
        const size_t bitOffset = 0;
        const size_t num_bits = 8;
        unsigned long retval = extract_bits (data, bitOffset, num_bits);
        return retval;
    };
    size_t sectionSyntaxIndicator (void) const
    {
        const size_t bitOffset = 0 + 8;
        const size_t num_bits = 1;
        unsigned long retval = extract_bits (data, bitOffset, num_bits);
        return retval;
    };
    ...
    ...
    size_t descriptors_num_elts (void) const
    {
        if (descriptors_num_elts_x == 0 && descriptors_num_bytes () != 0) 
        {
            size_t byteOffset =
              (0 + 8 + 1 + 1 + 2 + 12 + 16 + 2 + 5 + 1 + 8 + 8 + 8 + 16 +
               tables_num_bits () + 4 + 12) / 8;
            size_t total_bytes = descriptors_num_bytes ();
            for (size_t num_bytes = 0; num_bytes < total_bytes; 
                                              ++descriptors_num_elts_x)
            {
                SIDescriptor x (data + byteOffset + num_bytes);
                num_bytes += x.num_bits () / 8;
            }
        }
        return  descriptors_num_elts_x;
    };
}