Panda3D
Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes

DCPackerInterface Class Reference

This defines the internal interface for packing values into a DCField. More...

#include "dcPackerInterface.h"

Inheritance diagram for DCPackerInterface:
DCField DCSwitch::SwitchFields DCAtomicField DCMolecularField DCParameter DCArrayParameter DCClassParameter DCSimpleParameter DCSwitchParameter

List of all members.

Public Member Functions

 DCPackerInterface (const string &name=string())
 DCPackerInterface (const DCPackerInterface &copy)
virtual DCClassParameteras_class_parameter ()
virtual const DCClassParameteras_class_parameter () const
virtual DCFieldas_field ()
virtual const DCFieldas_field () const
virtual DCSwitchParameteras_switch_parameter ()
virtual const DCSwitchParameteras_switch_parameter () const
virtual int calc_num_nested_fields (size_t length_bytes) const
 This flavor of get_num_nested_fields is used during unpacking.
bool check_match (const DCPackerInterface *other) const
 Returns true if the other interface is bitwise the same as this one--that is, a uint32 only matches a uint32, etc.
bool check_match (const string &description, DCFile *dcfile=NULL) const
 Returns true if this interface is bitwise the same as the interface described with the indicated formatted string, e.g.
virtual bool do_check_match_array_parameter (const DCArrayParameter *other) const
 Returns true if this field matches the indicated array parameter, false otherwise.
virtual bool do_check_match_atomic_field (const DCAtomicField *other) const
 Returns true if this field matches the indicated atomic field, false otherwise.
virtual bool do_check_match_class_parameter (const DCClassParameter *other) const
 Returns true if this field matches the indicated class parameter, false otherwise.
virtual bool do_check_match_molecular_field (const DCMolecularField *other) const
 Returns true if this field matches the indicated molecular field, false otherwise.
virtual bool do_check_match_simple_parameter (const DCSimpleParameter *other) const
 Returns true if this field matches the indicated simple parameter, false otherwise.
virtual bool do_check_match_switch_parameter (const DCSwitchParameter *other) const
 Returns true if this field matches the indicated switch parameter, false otherwise.
int find_seek_index (const string &name) const
 Returns the index number to be passed to a future call to DCPacker::seek() to seek directly to the named field without having to look up the field name in a table later, or -1 if the named field cannot be found.
const DCPackerCatalogget_catalog () const
 Returns the DCPackerCatalog associated with this field, listing all of the nested fields by name.
size_t get_fixed_byte_size () const
 If has_fixed_byte_size() returns true, this returns the number of bytes this field type will use.
const string & get_name () const
 Returns the name of this field, or empty string if the field is unnamed.
virtual DCPackerInterfaceget_nested_field (int n) const
 Returns the DCPackerInterface object that represents the nth nested field.
size_t get_num_length_bytes () const
 Returns the number of bytes that should be written into the stream on a push() to record the number of bytes in the record up until the next pop().
int get_num_nested_fields () const
 Returns the number of nested fields required by this field type.
DCPackType get_pack_type () const
 Returns the type of value expected by this field.
bool has_fixed_byte_size () const
 Returns true if this field type always packs to the same number of bytes, false if it is variable.
bool has_fixed_structure () const
 Returns true if this field type always has the same structure regardless of the data in the stream, or false if its structure may vary.
bool has_nested_fields () const
 Returns true if this field type has any nested fields (and thus expects a push() .
bool has_range_limits () const
 Returns true if this field, or any sub-field of this field, has a limit imposed in the DC file on its legal values.
virtual bool pack_default_value (DCPackData &pack_data, bool &pack_error) const
 Packs the field's specified default value (or a sensible default if no value is specified) into the stream.
virtual void pack_double (DCPackData &pack_data, double value, bool &pack_error, bool &range_error) const
 Packs the indicated numeric or string value into the stream.
virtual void pack_int (DCPackData &pack_data, int value, bool &pack_error, bool &range_error) const
 Packs the indicated numeric or string value into the stream.
virtual void pack_int64 (DCPackData &pack_data, PN_int64 value, bool &pack_error, bool &range_error) const
 Packs the indicated numeric or string value into the stream.
virtual void pack_string (DCPackData &pack_data, const string &value, bool &pack_error, bool &range_error) const
 Packs the indicated numeric or string value into the stream.
virtual void pack_uint (DCPackData &pack_data, unsigned int value, bool &pack_error, bool &range_error) const
 Packs the indicated numeric or string value into the stream.
virtual void pack_uint64 (DCPackData &pack_data, PN_uint64 value, bool &pack_error, bool &range_error) const
 Packs the indicated numeric or string value into the stream.
virtual void set_name (const string &name)
 Sets the name of this field.
virtual void unpack_double (const char *data, size_t length, size_t &p, double &value, bool &pack_error, bool &range_error) const
 Unpacks the current numeric or string value from the stream.
virtual void unpack_int (const char *data, size_t length, size_t &p, int &value, bool &pack_error, bool &range_error) const
 Unpacks the current numeric or string value from the stream.
virtual void unpack_int64 (const char *data, size_t length, size_t &p, PN_int64 &value, bool &pack_error, bool &range_error) const
 Unpacks the current numeric or string value from the stream.
virtual bool unpack_skip (const char *data, size_t length, size_t &p, bool &pack_error) const
 Increments p to the end of the current field without actually unpacking any data or performing any range validation.
virtual void unpack_string (const char *data, size_t length, size_t &p, string &value, bool &pack_error, bool &range_error) const
 Unpacks the current numeric or string value from the stream.
virtual void unpack_uint (const char *data, size_t length, size_t &p, unsigned int &value, bool &pack_error, bool &range_error) const
 Unpacks the current numeric or string value from the stream.
virtual void unpack_uint64 (const char *data, size_t length, size_t &p, PN_uint64 &value, bool &pack_error, bool &range_error) const
 Unpacks the current numeric or string value from the stream.
virtual bool unpack_validate (const char *data, size_t length, size_t &p, bool &pack_error, bool &range_error) const
 Internally unpacks the current numeric or string value and validates it against the type range limits, but does not return the value.
virtual bool validate_num_nested_fields (int num_nested_fields) const
 After a number of fields have been packed via push()

Static Public Member Functions

static void do_pack_float64 (char *buffer, double value)
static void do_pack_int16 (char *buffer, int value)
static void do_pack_int32 (char *buffer, int value)
static void do_pack_int64 (char *buffer, PN_int64 value)
static void do_pack_int8 (char *buffer, int value)
static void do_pack_uint16 (char *buffer, unsigned int value)
static void do_pack_uint32 (char *buffer, unsigned int value)
static void do_pack_uint64 (char *buffer, PN_uint64 value)
static void do_pack_uint8 (char *buffer, unsigned int value)
static double do_unpack_float64 (const char *buffer)
static int do_unpack_int16 (const char *buffer)
static int do_unpack_int32 (const char *buffer)
static PN_int64 do_unpack_int64 (const char *buffer)
static int do_unpack_int8 (const char *buffer)
static unsigned int do_unpack_uint16 (const char *buffer)
static unsigned int do_unpack_uint32 (const char *buffer)
static PN_uint64 do_unpack_uint64 (const char *buffer)
static unsigned int do_unpack_uint8 (const char *buffer)
static void validate_int64_limits (PN_int64 value, int num_bits, bool &range_error)
 Confirms that the signed value fits within num_bits bits.
static void validate_int_limits (int value, int num_bits, bool &range_error)
 Confirms that the signed value fits within num_bits bits.
static void validate_uint64_limits (PN_uint64 value, int num_bits, bool &range_error)
 Confirms that the unsigned value fits within num_bits bits.
static void validate_uint_limits (unsigned int value, int num_bits, bool &range_error)
 Confirms that the unsigned value fits within num_bits bits.

Protected Member Functions

virtual bool do_check_match (const DCPackerInterface *other) const =0

Protected Attributes

size_t _fixed_byte_size
bool _has_fixed_byte_size
bool _has_fixed_structure
bool _has_nested_fields
bool _has_range_limits
string _name
size_t _num_length_bytes
int _num_nested_fields
DCPackType _pack_type

Detailed Description

This defines the internal interface for packing values into a DCField.

The various different DC objects inherit from this.

Normally these methods are called only by the DCPacker object; the user wouldn't normally call these directly.

Definition at line 71 of file dcPackerInterface.h.


Member Function Documentation

int DCPackerInterface::calc_num_nested_fields ( size_t  length_bytes) const [virtual]

This flavor of get_num_nested_fields is used during unpacking.

It returns the number of nested fields to expect, given a certain length in bytes (as read from the _num_length_bytes stored in the stream on the push). This will only be called if _num_length_bytes is nonzero.

Reimplemented in DCArrayParameter, and DCSimpleParameter.

Definition at line 210 of file dcPackerInterface.cxx.

Referenced by DCPacker::push().

bool DCPackerInterface::check_match ( const DCPackerInterface other) const [inline]

Returns true if the other interface is bitwise the same as this one--that is, a uint32 only matches a uint32, etc.

Names of components, and range limits, are not compared.

Definition at line 36 of file dcPackerInterface.I.

Referenced by check_match(), DCArrayParameter::do_check_match_array_parameter(), DCClassParameter::do_check_match_array_parameter(), DCAtomicField::do_check_match_atomic_field(), DCClassParameter::do_check_match_class_parameter(), DCMolecularField::do_check_match_molecular_field(), and DCSwitch::do_check_match_switch().

bool DCPackerInterface::check_match ( const string &  description,
DCFile dcfile = NULL 
) const

Returns true if this interface is bitwise the same as the interface described with the indicated formatted string, e.g.

"(uint8, uint8, int16)", or false otherwise.

If DCFile is not NULL, it specifies the DCFile that was previously loaded, from which some predefined structs and typedefs may be referenced in the description string.

Definition at line 167 of file dcPackerInterface.cxx.

References check_match().

bool DCPackerInterface::do_check_match_array_parameter ( const DCArrayParameter other) const [virtual]

Returns true if this field matches the indicated array parameter, false otherwise.

Reimplemented in DCArrayParameter, DCClassParameter, and DCSimpleParameter.

Definition at line 505 of file dcPackerInterface.cxx.

Referenced by DCArrayParameter::do_check_match().

bool DCPackerInterface::do_check_match_atomic_field ( const DCAtomicField other) const [virtual]

Returns true if this field matches the indicated atomic field, false otherwise.

Reimplemented in DCAtomicField.

Definition at line 516 of file dcPackerInterface.cxx.

Referenced by DCAtomicField::do_check_match().

bool DCPackerInterface::do_check_match_class_parameter ( const DCClassParameter other) const [virtual]

Returns true if this field matches the indicated class parameter, false otherwise.

Reimplemented in DCArrayParameter, and DCClassParameter.

Definition at line 483 of file dcPackerInterface.cxx.

Referenced by DCClassParameter::do_check_match().

bool DCPackerInterface::do_check_match_molecular_field ( const DCMolecularField other) const [virtual]

Returns true if this field matches the indicated molecular field, false otherwise.

Reimplemented in DCMolecularField.

Definition at line 527 of file dcPackerInterface.cxx.

Referenced by DCMolecularField::do_check_match().

bool DCPackerInterface::do_check_match_simple_parameter ( const DCSimpleParameter other) const [virtual]

Returns true if this field matches the indicated simple parameter, false otherwise.

Reimplemented in DCArrayParameter, and DCSimpleParameter.

Definition at line 472 of file dcPackerInterface.cxx.

Referenced by DCSimpleParameter::do_check_match().

bool DCPackerInterface::do_check_match_switch_parameter ( const DCSwitchParameter other) const [virtual]

Returns true if this field matches the indicated switch parameter, false otherwise.

Reimplemented in DCSwitchParameter.

Definition at line 494 of file dcPackerInterface.cxx.

Referenced by DCSwitchParameter::do_check_match().

int DCPackerInterface::find_seek_index ( const string &  name) const

Returns the index number to be passed to a future call to DCPacker::seek() to seek directly to the named field without having to look up the field name in a table later, or -1 if the named field cannot be found.

If the named field is nested within a switch or some similar dynamic structure that reveals different fields based on the contents of the data, this mechanism cannot be used to pre-fetch the field index number--you must seek for the field by name.

Definition at line 89 of file dcPackerInterface.cxx.

References DCPackerCatalog::find_entry_by_name(), and get_catalog().

const DCPackerCatalog * DCPackerInterface::get_catalog ( ) const

Returns the DCPackerCatalog associated with this field, listing all of the nested fields by name.

Definition at line 458 of file dcPackerInterface.cxx.

Referenced by DCPacker::begin_repack(), find_seek_index(), and DCPacker::seek().

size_t DCPackerInterface::get_fixed_byte_size ( ) const [inline]

If has_fixed_byte_size() returns true, this returns the number of bytes this field type will use.

Definition at line 58 of file dcPackerInterface.I.

Referenced by DCMolecularField::add_atomic(), DCAtomicField::add_element(), DCSwitch::SwitchFields::add_field(), and DCArrayParameter::calc_num_nested_fields().

const string & DCPackerInterface::get_name ( ) const [inline]
DCPackerInterface * DCPackerInterface::get_nested_field ( int  n) const [virtual]

Returns the DCPackerInterface object that represents the nth nested field.

This may return NULL if there is no such field (but it shouldn't do this if n is in the range 0 <= n < get_num_nested_fields()).

Reimplemented in DCArrayParameter, DCAtomicField, DCClassParameter, DCMolecularField, DCSimpleParameter, DCSwitch::SwitchFields, and DCSwitchParameter.

Definition at line 223 of file dcPackerInterface.cxx.

Referenced by DCPacker::output_hex_string(), and DCPacker::push().

size_t DCPackerInterface::get_num_length_bytes ( ) const [inline]

Returns the number of bytes that should be written into the stream on a push() to record the number of bytes in the record up until the next pop().

This is only meaningful if _has_nested_fields is true.

Definition at line 102 of file dcPackerInterface.I.

Referenced by DCPacker::pop(), and DCPacker::push().

int DCPackerInterface::get_num_nested_fields ( ) const [inline]

Returns the number of nested fields required by this field type.

These may be array elements or structure elements. The return value may be -1 to indicate the number of nested fields is variable.

Definition at line 130 of file dcPackerInterface.I.

Referenced by DCMolecularField::add_atomic(), DCPacker::output_hex_string(), DCPacker::pop(), DCPacker::push(), and DCPacker::seek().

DCPackType DCPackerInterface::get_pack_type ( ) const [inline]

Returns the type of value expected by this field.

Definition at line 140 of file dcPackerInterface.I.

Referenced by DCPacker::get_pack_type().

bool DCPackerInterface::has_fixed_byte_size ( ) const [inline]

Returns true if this field type always packs to the same number of bytes, false if it is variable.

Definition at line 47 of file dcPackerInterface.I.

Referenced by DCMolecularField::add_atomic(), DCAtomicField::add_element(), DCSwitch::SwitchFields::add_field(), and DCArrayParameter::calc_num_nested_fields().

bool DCPackerInterface::has_fixed_structure ( ) const [inline]

Returns true if this field type always has the same structure regardless of the data in the stream, or false if its structure may vary.

This is almost, but not quite, the same thing as has_fixed_byte_size. The difference is that a DCSwitch may have multiple cases all with the same byte size, but they will still (presumably) have different structures, in the sense that the actual list of fields varies according to the live data.

Definition at line 76 of file dcPackerInterface.I.

Referenced by DCMolecularField::add_atomic(), DCAtomicField::add_element(), DCSwitch::SwitchFields::add_field(), and DCPackerCatalog::get_live_catalog().

bool DCPackerInterface::has_nested_fields ( ) const [inline]

Returns true if this field type has any nested fields (and thus expects a push() .

. pop() interface to the DCPacker), or false otherwise. If this returns true, get_num_nested_fields() may be called to determine how many nested fields are expected.

Definition at line 117 of file dcPackerInterface.I.

Referenced by DCPacker::has_nested_fields().

bool DCPackerInterface::has_range_limits ( ) const [inline]

Returns true if this field, or any sub-field of this field, has a limit imposed in the DC file on its legal values.

If this is false, then unpack_validate() is trivial.

Definition at line 89 of file dcPackerInterface.I.

Referenced by DCMolecularField::add_atomic(), DCAtomicField::add_element(), and DCSwitch::SwitchFields::add_field().

bool DCPackerInterface::pack_default_value ( DCPackData pack_data,
bool &  pack_error 
) const [virtual]

Packs the field's specified default value (or a sensible default if no value is specified) into the stream.

Returns true if the default value is packed, false if the field doesn't know how to pack its default value.

Reimplemented in DCArrayParameter, DCField, DCSimpleParameter, and DCSwitchParameter.

Definition at line 318 of file dcPackerInterface.cxx.

Referenced by DCPacker::pack_default_value().

void DCPackerInterface::pack_double ( DCPackData pack_data,
double  value,
bool &  pack_error,
bool &  range_error 
) const [virtual]

Packs the indicated numeric or string value into the stream.

Reimplemented in DCSimpleParameter.

Definition at line 249 of file dcPackerInterface.cxx.

Referenced by DCPacker::pack_double().

void DCPackerInterface::pack_int ( DCPackData pack_data,
int  value,
bool &  pack_error,
bool &  range_error 
) const [virtual]

Packs the indicated numeric or string value into the stream.

Reimplemented in DCSimpleParameter.

Definition at line 260 of file dcPackerInterface.cxx.

Referenced by DCPacker::pack_int().

void DCPackerInterface::pack_int64 ( DCPackData pack_data,
PN_int64  value,
bool &  pack_error,
bool &  range_error 
) const [virtual]

Packs the indicated numeric or string value into the stream.

Reimplemented in DCSimpleParameter.

Definition at line 282 of file dcPackerInterface.cxx.

Referenced by DCPacker::pack_int64().

void DCPackerInterface::pack_string ( DCPackData pack_data,
const string &  value,
bool &  pack_error,
bool &  range_error 
) const [virtual]

Packs the indicated numeric or string value into the stream.

Reimplemented in DCArrayParameter, and DCSimpleParameter.

Definition at line 304 of file dcPackerInterface.cxx.

Referenced by DCPacker::pack_string().

void DCPackerInterface::pack_uint ( DCPackData pack_data,
unsigned int  value,
bool &  pack_error,
bool &  range_error 
) const [virtual]

Packs the indicated numeric or string value into the stream.

Reimplemented in DCSimpleParameter.

Definition at line 271 of file dcPackerInterface.cxx.

Referenced by DCPacker::pack_uint().

void DCPackerInterface::pack_uint64 ( DCPackData pack_data,
PN_uint64  value,
bool &  pack_error,
bool &  range_error 
) const [virtual]

Packs the indicated numeric or string value into the stream.

Reimplemented in DCSimpleParameter.

Definition at line 293 of file dcPackerInterface.cxx.

Referenced by DCPacker::pack_uint64().

void DCPackerInterface::set_name ( const string &  name) [virtual]

Sets the name of this field.

Reimplemented in DCField.

Definition at line 195 of file dcPackerInterface.cxx.

void DCPackerInterface::unpack_double ( const char *  data,
size_t  length,
size_t &  p,
double &  value,
bool &  pack_error,
bool &  range_error 
) const [virtual]

Unpacks the current numeric or string value from the stream.

Reimplemented in DCSimpleParameter.

Definition at line 329 of file dcPackerInterface.cxx.

Referenced by DCPacker::unpack_double().

void DCPackerInterface::unpack_int ( const char *  data,
size_t  length,
size_t &  p,
int &  value,
bool &  pack_error,
bool &  range_error 
) const [virtual]

Unpacks the current numeric or string value from the stream.

Reimplemented in DCSimpleParameter.

Definition at line 340 of file dcPackerInterface.cxx.

Referenced by DCPacker::unpack_int().

void DCPackerInterface::unpack_int64 ( const char *  data,
size_t  length,
size_t &  p,
PN_int64 &  value,
bool &  pack_error,
bool &  range_error 
) const [virtual]

Unpacks the current numeric or string value from the stream.

Reimplemented in DCSimpleParameter.

Definition at line 362 of file dcPackerInterface.cxx.

Referenced by DCPacker::unpack_int64().

bool DCPackerInterface::unpack_skip ( const char *  data,
size_t  length,
size_t &  p,
bool &  pack_error 
) const [virtual]

Increments p to the end of the current field without actually unpacking any data or performing any range validation.

Returns true on success, false on failure (e.g. we don't know how to skip this field).

Reimplemented in DCSimpleParameter.

Definition at line 415 of file dcPackerInterface.cxx.

Referenced by DCPacker::unpack_skip(), and unpack_validate().

void DCPackerInterface::unpack_string ( const char *  data,
size_t  length,
size_t &  p,
string &  value,
bool &  pack_error,
bool &  range_error 
) const [virtual]

Unpacks the current numeric or string value from the stream.

Reimplemented in DCArrayParameter, and DCSimpleParameter.

Definition at line 384 of file dcPackerInterface.cxx.

Referenced by DCPacker::unpack_string().

void DCPackerInterface::unpack_uint ( const char *  data,
size_t  length,
size_t &  p,
unsigned int &  value,
bool &  pack_error,
bool &  range_error 
) const [virtual]

Unpacks the current numeric or string value from the stream.

Reimplemented in DCSimpleParameter.

Definition at line 351 of file dcPackerInterface.cxx.

Referenced by DCPacker::unpack_uint().

void DCPackerInterface::unpack_uint64 ( const char *  data,
size_t  length,
size_t &  p,
PN_uint64 &  value,
bool &  pack_error,
bool &  range_error 
) const [virtual]

Unpacks the current numeric or string value from the stream.

Reimplemented in DCSimpleParameter.

Definition at line 373 of file dcPackerInterface.cxx.

Referenced by DCPacker::unpack_uint64().

bool DCPackerInterface::unpack_validate ( const char *  data,
size_t  length,
size_t &  p,
bool &  pack_error,
bool &  range_error 
) const [virtual]

Internally unpacks the current numeric or string value and validates it against the type range limits, but does not return the value.

Returns true on success, false on failure (e.g. we don't know how to validate this field).

Reimplemented in DCSimpleParameter.

Definition at line 398 of file dcPackerInterface.cxx.

References unpack_skip().

Referenced by DCPacker::unpack_validate().

void DCPackerInterface::validate_int64_limits ( PN_int64  value,
int  num_bits,
bool &  range_error 
) [inline, static]

Confirms that the signed value fits within num_bits bits.

Sets range_error true if it does not.

Definition at line 416 of file dcPackerInterface.I.

void DCPackerInterface::validate_int_limits ( int  value,
int  num_bits,
bool &  range_error 
) [inline, static]

Confirms that the signed value fits within num_bits bits.

Sets range_error true if it does not.

Definition at line 394 of file dcPackerInterface.I.

bool DCPackerInterface::validate_num_nested_fields ( int  num_nested_fields) const [virtual]

After a number of fields have been packed via push()

. pack_*() .. pop(), this is called to confirm that the number of nested fields that were added is valid for this type. This is primarily useful for array types with dynamic ranges that can't validate the number of fields any other way.

Reimplemented in DCArrayParameter.

Definition at line 238 of file dcPackerInterface.cxx.

Referenced by DCPacker::pop().

void DCPackerInterface::validate_uint64_limits ( PN_uint64  value,
int  num_bits,
bool &  range_error 
) [inline, static]

Confirms that the unsigned value fits within num_bits bits.

Sets range_error true if it does not.

Definition at line 451 of file dcPackerInterface.I.

void DCPackerInterface::validate_uint_limits ( unsigned int  value,
int  num_bits,
bool &  range_error 
) [inline, static]

Confirms that the unsigned value fits within num_bits bits.

Sets range_error true if it does not.

Definition at line 432 of file dcPackerInterface.I.

Referenced by DCPacker::pop().


The documentation for this class was generated from the following files:
 All Classes Functions Variables Enumerations