Panda3D
dcPackerInterface.h
Go to the documentation of this file.
1 /**
2  * PANDA 3D SOFTWARE
3  * Copyright (c) Carnegie Mellon University. All rights reserved.
4  *
5  * All use of this software is subject to the terms of the revised BSD
6  * license. You should have received a copy of this license along
7  * with this source code in a file named "LICENSE."
8  *
9  * @file dcPackerInterface.h
10  * @author drose
11  * @date 2004-06-15
12  */
13 
14 #ifndef DCPACKERINTERFACE_H
15 #define DCPACKERINTERFACE_H
16 
17 #include "dcbase.h"
18 #include "dcSubatomicType.h"
19 
20 class DCFile;
21 class DCField;
22 class DCSimpleParameter;
23 class DCSwitchParameter;
24 class DCClassParameter;
25 class DCArrayParameter;
26 class DCAtomicField;
27 class DCMolecularField;
28 class DCPackData;
29 class DCPackerCatalog;
30 
31 BEGIN_PUBLISH
32 // This enumerated type is returned by get_pack_type() and represents the best
33 // choice for a subsequent call to pack_*() or unpack_*().
34 enum DCPackType {
35  // This one should never be returned in a normal situation.
36  PT_invalid,
37 
38  // These PackTypes are all fundamental types, and should be packed (or
39  // unpacked) with the corresponding call to pack_double(), pack_int(), etc.
40  // PT_blob is similar to PT_string, except that it contains arbitrary binary
41  // data instead of just UTF-8 text.
42  PT_double,
43  PT_int,
44  PT_uint,
45  PT_int64,
46  PT_uint64,
47  PT_string,
48  PT_blob,
49 
50  // The remaining PackTypes imply a need to call push() and pop(). They are
51  // all variants on the same thing: a list of nested fields, but the PackType
52  // provides a bit of a semantic context.
53  PT_array,
54  PT_field,
55  PT_class,
56  PT_switch,
57 };
58 END_PUBLISH
59 
60 /**
61  * This defines the internal interface for packing values into a DCField. The
62  * various different DC objects inherit from this.
63  *
64  * Normally these methods are called only by the DCPacker object; the user
65  * wouldn't normally call these directly.
66  */
67 class EXPCL_DIRECT_DCPARSER DCPackerInterface {
68 public:
69  DCPackerInterface(const std::string &name = std::string());
71  virtual ~DCPackerInterface();
72 
73 PUBLISHED:
74  INLINE const std::string &get_name() const;
75  int find_seek_index(const std::string &name) const;
76 
77  virtual DCField *as_field();
78  virtual const DCField *as_field() const;
79  virtual DCSwitchParameter *as_switch_parameter();
80  virtual const DCSwitchParameter *as_switch_parameter() const;
81  virtual DCClassParameter *as_class_parameter();
82  virtual const DCClassParameter *as_class_parameter() const;
83 
84  INLINE bool check_match(const DCPackerInterface *other) const;
85  bool check_match(const std::string &description, DCFile *dcfile = nullptr) const;
86 
87 public:
88  virtual void set_name(const std::string &name);
89  INLINE bool has_fixed_byte_size() const;
90  INLINE size_t get_fixed_byte_size() const;
91  INLINE bool has_fixed_structure() const;
92  INLINE bool has_range_limits() const;
93  INLINE size_t get_num_length_bytes() const;
94 
95  INLINE bool has_nested_fields() const;
96  INLINE int get_num_nested_fields() const;
97  virtual int calc_num_nested_fields(size_t length_bytes) const;
98  virtual DCPackerInterface *get_nested_field(int n) const;
99 
100  virtual bool validate_num_nested_fields(int num_nested_fields) const;
101 
102  INLINE DCPackType get_pack_type() const;
103 
104  virtual void pack_double(DCPackData &pack_data, double value,
105  bool &pack_error, bool &range_error) const;
106  virtual void pack_int(DCPackData &pack_data, int value,
107  bool &pack_error, bool &range_error) const;
108  virtual void pack_uint(DCPackData &pack_data, unsigned int value,
109  bool &pack_error, bool &range_error) const;
110  virtual void pack_int64(DCPackData &pack_data, int64_t value,
111  bool &pack_error, bool &range_error) const;
112  virtual void pack_uint64(DCPackData &pack_data, uint64_t value,
113  bool &pack_error, bool &range_error) const;
114  virtual void pack_string(DCPackData &pack_data, const std::string &value,
115  bool &pack_error, bool &range_error) const;
116  virtual void pack_blob(DCPackData &pack_data, const vector_uchar &value,
117  bool &pack_error, bool &range_error) const;
118  virtual bool pack_default_value(DCPackData &pack_data, bool &pack_error) const;
119 
120  virtual void unpack_double(const char *data, size_t length, size_t &p,
121  double &value, bool &pack_error, bool &range_error) const;
122  virtual void unpack_int(const char *data, size_t length, size_t &p,
123  int &value, bool &pack_error, bool &range_error) const;
124  virtual void unpack_uint(const char *data, size_t length, size_t &p,
125  unsigned int &value, bool &pack_error, bool &range_error) const;
126  virtual void unpack_int64(const char *data, size_t length, size_t &p,
127  int64_t &value, bool &pack_error, bool &range_error) const;
128  virtual void unpack_uint64(const char *data, size_t length, size_t &p,
129  uint64_t &value, bool &pack_error, bool &range_error) const;
130  virtual void unpack_string(const char *data, size_t length, size_t &p,
131  std::string &value, bool &pack_error, bool &range_error) const;
132  virtual void unpack_blob(const char *data, size_t length, size_t &p,
133  vector_uchar &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 numbers from
140  // a buffer. You're responsible for making sure the buffer has enough room,
141  // 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, int64_t 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, uint64_t 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 int64_t 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 uint64_t 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(int64_t 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(uint64_t 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 them
178  // 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  std::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
DCPackerInterface
This defines the internal interface for packing values into a DCField.
Definition: dcPackerInterface.h:67
DCFile
Represents the complete list of Distributed Class descriptions as read from a .dc file.
Definition: dcFile.h:32
DCField
A single field of a Distributed Class, either atomic or molecular.
Definition: dcField.h:37
DCArrayParameter
This represents an array of some other kind of object, meaning this parameter type accepts an arbitra...
Definition: dcArrayParameter.h:26
DCMolecularField
A single molecular field of a Distributed Class, as read from a .dc file.
Definition: dcMolecularField.h:28
dcPackerInterface.I
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
DCSwitchParameter
This represents a switch object used as a parameter itself, which packs the appropriate fields of the...
Definition: dcSwitchParameter.h:26
DCPackData
This is a block of data that receives the results of DCPacker.
Definition: dcPackData.h:22
DCClassParameter
This represents a class (or struct) object used as a parameter itself.
Definition: dcClassParameter.h:26
DCPackerCatalog
This object contains the names of all of the nested fields available within a particular field.
Definition: dcPackerCatalog.h:29
dcbase.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
DCAtomicField
A single atomic field of a Distributed Class, as read from a .dc file.
Definition: dcAtomicField.h:30
dcSubatomicType.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
DCSimpleParameter
This is the most fundamental kind of parameter type: a single number or string, one of the DCSubatomi...
Definition: dcSimpleParameter.h:28