Panda3D
dcPackerInterface.h
1 // Filename: dcPackerInterface.h
2 // Created by: drose (15Jun04)
3 //
4 ////////////////////////////////////////////////////////////////////
5 //
6 // PANDA 3D SOFTWARE
7 // Copyright (c) Carnegie Mellon University. All rights reserved.
8 //
9 // All use of this software is subject to the terms of the revised BSD
10 // license. You should have received a copy of this license along
11 // with this source code in a file named "LICENSE."
12 //
13 ////////////////////////////////////////////////////////////////////
14 
15 #ifndef DCPACKERINTERFACE_H
16 #define DCPACKERINTERFACE_H
17 
18 #include "dcbase.h"
19 #include "dcSubatomicType.h"
20 
21 class DCFile;
22 class DCField;
23 class DCSimpleParameter;
24 class DCSwitchParameter;
25 class DCClassParameter;
26 class DCArrayParameter;
27 class DCAtomicField;
28 class DCMolecularField;
29 class DCPackData;
30 class DCPackerCatalog;
31 
32 BEGIN_PUBLISH
33 // This enumerated type is returned by get_pack_type() and represents
34 // the best choice for a subsequent call to pack_*() or unpack_*().
35 enum DCPackType {
36  // This one should never be returned in a normal situation.
37  PT_invalid,
38 
39  // These PackTypes are all fundamental types, and should be packed
40  // (or unpacked) with the corresponding call to pack_double(),
41  // pack_int(), etc. PT_blob is the same as PT_string, but implies
42  // that the string contains binary data.
43  PT_double,
44  PT_int,
45  PT_uint,
46  PT_int64,
47  PT_uint64,
48  PT_string,
49  PT_blob,
50 
51  // The remaining PackTypes imply a need to call push() and pop().
52  // They are all variants on the same thing: a list of nested fields,
53  // but the PackType provides a bit of a semantic context.
54  PT_array,
55  PT_field,
56  PT_class,
57  PT_switch,
58 };
59 END_PUBLISH
60 
61 ////////////////////////////////////////////////////////////////////
62 // Class : DCPackerInterface
63 // Description : This defines the internal interface for packing
64 // values into a DCField. The various different DC
65 // objects inherit from this.
66 //
67 // Normally these methods are called only by the
68 // DCPacker object; the user wouldn't normally call
69 // these directly.
70 ////////////////////////////////////////////////////////////////////
71 class EXPCL_DIRECT DCPackerInterface {
72 public:
73  DCPackerInterface(const string &name = string());
75  virtual ~DCPackerInterface();
76 
77 PUBLISHED:
78  INLINE const string &get_name() const;
79  int find_seek_index(const string &name) const;
80 
81  virtual DCField *as_field();
82  virtual const DCField *as_field() const;
83  virtual DCSwitchParameter *as_switch_parameter();
84  virtual const DCSwitchParameter *as_switch_parameter() const;
85  virtual DCClassParameter *as_class_parameter();
86  virtual const DCClassParameter *as_class_parameter() const;
87 
88  INLINE bool check_match(const DCPackerInterface *other) const;
89  bool check_match(const string &description, DCFile *dcfile = NULL) const;
90 
91 public:
92  virtual void set_name(const string &name);
93  INLINE bool has_fixed_byte_size() const;
94  INLINE size_t get_fixed_byte_size() const;
95  INLINE bool has_fixed_structure() const;
96  INLINE bool has_range_limits() const;
97  INLINE size_t get_num_length_bytes() const;
98 
99  INLINE bool has_nested_fields() const;
100  INLINE int get_num_nested_fields() const;
101  virtual int calc_num_nested_fields(size_t length_bytes) const;
102  virtual DCPackerInterface *get_nested_field(int n) const;
103 
104  virtual bool validate_num_nested_fields(int num_nested_fields) const;
105 
106  INLINE DCPackType get_pack_type() const;
107 
108  virtual void pack_double(DCPackData &pack_data, double value,
109  bool &pack_error, bool &range_error) const;
110  virtual void pack_int(DCPackData &pack_data, int value,
111  bool &pack_error, bool &range_error) const;
112  virtual void pack_uint(DCPackData &pack_data, unsigned int value,
113  bool &pack_error, bool &range_error) const;
114  virtual void pack_int64(DCPackData &pack_data, PN_int64 value,
115  bool &pack_error, bool &range_error) const;
116  virtual void pack_uint64(DCPackData &pack_data, PN_uint64 value,
117  bool &pack_error, bool &range_error) const;
118  virtual void pack_string(DCPackData &pack_data, const string &value,
119  bool &pack_error, bool &range_error) const;
120  virtual bool pack_default_value(DCPackData &pack_data, bool &pack_error) const;
121 
122  virtual void unpack_double(const char *data, size_t length, size_t &p,
123  double &value, bool &pack_error, bool &range_error) const;
124  virtual void unpack_int(const char *data, size_t length, size_t &p,
125  int &value, bool &pack_error, bool &range_error) const;
126  virtual void unpack_uint(const char *data, size_t length, size_t &p,
127  unsigned int &value, bool &pack_error, bool &range_error) const;
128  virtual void unpack_int64(const char *data, size_t length, size_t &p,
129  PN_int64 &value, bool &pack_error, bool &range_error) const;
130  virtual void unpack_uint64(const char *data, size_t length, size_t &p,
131  PN_uint64 &value, bool &pack_error, bool &range_error) const;
132  virtual void unpack_string(const char *data, size_t length, size_t &p,
133  string &value, bool &pack_error, bool &range_error) const;
134  virtual bool unpack_validate(const char *data, size_t length, size_t &p,
135  bool &pack_error, bool &range_error) const;
136  virtual bool unpack_skip(const char *data, size_t length, size_t &p,
137  bool &pack_error) const;
138 
139  // These are the low-level interfaces for packing and unpacking
140  // numbers from a buffer. You're responsible for making sure the
141  // buffer has enough room, and for incrementing the pointer.
142  INLINE static void do_pack_int8(char *buffer, int value);
143  INLINE static void do_pack_int16(char *buffer, int value);
144  INLINE static void do_pack_int32(char *buffer, int value);
145  INLINE static void do_pack_int64(char *buffer, PN_int64 value);
146  INLINE static void do_pack_uint8(char *buffer, unsigned int value);
147  INLINE static void do_pack_uint16(char *buffer, unsigned int value);
148  INLINE static void do_pack_uint32(char *buffer, unsigned int value);
149  INLINE static void do_pack_uint64(char *buffer, PN_uint64 value);
150  INLINE static void do_pack_float64(char *buffer, double value);
151 
152  INLINE static int do_unpack_int8(const char *buffer);
153  INLINE static int do_unpack_int16(const char *buffer);
154  INLINE static int do_unpack_int32(const char *buffer);
155  INLINE static PN_int64 do_unpack_int64(const char *buffer);
156  INLINE static unsigned int do_unpack_uint8(const char *buffer);
157  INLINE static unsigned int do_unpack_uint16(const char *buffer);
158  INLINE static unsigned int do_unpack_uint32(const char *buffer);
159  INLINE static PN_uint64 do_unpack_uint64(const char *buffer);
160  INLINE static double do_unpack_float64(const char *buffer);
161 
162  INLINE static void validate_int_limits(int value, int num_bits,
163  bool &range_error);
164  INLINE static void validate_int64_limits(PN_int64 value, int num_bits,
165  bool &range_error);
166  INLINE static void validate_uint_limits(unsigned int value, int num_bits,
167  bool &range_error);
168  INLINE static void validate_uint64_limits(PN_uint64 value, int num_bits,
169  bool &range_error);
170 
171  const DCPackerCatalog *get_catalog() const;
172 
173 protected:
174  virtual bool do_check_match(const DCPackerInterface *other) const=0;
175 
176 public:
177  // These are declared public just so the derived classes can call
178  // them easily. They're not intended to be called directly.
179 
180  virtual bool do_check_match_simple_parameter(const DCSimpleParameter *other) const;
181  virtual bool do_check_match_class_parameter(const DCClassParameter *other) const;
182  virtual bool do_check_match_switch_parameter(const DCSwitchParameter *other) const;
183  virtual bool do_check_match_array_parameter(const DCArrayParameter *other) const;
184  virtual bool do_check_match_atomic_field(const DCAtomicField *other) const;
185  virtual bool do_check_match_molecular_field(const DCMolecularField *other) const;
186 
187 private:
188  void make_catalog();
189 
190 protected:
191  string _name;
192  bool _has_fixed_byte_size;
193  size_t _fixed_byte_size;
194  bool _has_fixed_structure;
195  bool _has_range_limits;
196  size_t _num_length_bytes;
197  bool _has_nested_fields;
198  int _num_nested_fields;
199  DCPackType _pack_type;
200 
201 private:
202  DCPackerCatalog *_catalog;
203 };
204 
205 #include "dcPackerInterface.I"
206 
207 #endif
This is a block of data that receives the results of DCPacker.
Definition: dcPackData.h:25
This represents a class (or struct) object used as a parameter itself.
A single field of a Distributed Class, either atomic or molecular.
Definition: dcField.h:40
This is the most fundamental kind of parameter type: a single number or string, one of the DCSubatomi...
This represents a switch object used as a parameter itself, which packs the appropriate fields of the...
A single atomic field of a Distributed Class, as read from a .dc file.
Definition: dcAtomicField.h:34
Represents the complete list of Distributed Class descriptions as read from a .dc file...
Definition: dcFile.h:34
This represents an array of some other kind of object, meaning this parameter type accepts an arbitra...
This object contains the names of all of the nested fields available within a particular field...
A single molecular field of a Distributed Class, as read from a .dc file.
This defines the internal interface for packing values into a DCField.