Panda3D
Loading...
Searching...
No Matches
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
20class DCFile;
21class DCField;
26class DCAtomicField;
28class DCPackData;
29class DCPackerCatalog;
30
31BEGIN_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_*().
34enum 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};
58END_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 */
67class EXPCL_DIRECT_DCPARSER DCPackerInterface {
68public:
69 DCPackerInterface(const std::string &name = std::string());
71 virtual ~DCPackerInterface();
72
73PUBLISHED:
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
87public:
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
173protected:
174 virtual bool do_check_match(const DCPackerInterface *other) const=0;
175
176public:
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
187private:
188 void make_catalog();
189
190protected:
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
201private:
202 DCPackerCatalog *_catalog;
203};
204
205#include "dcPackerInterface.I"
206
207#endif
This represents an array of some other kind of object, meaning this parameter type accepts an arbitra...
A single atomic field of a Distributed Class, as read from a .dc file.
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:37
Represents the complete list of Distributed Class descriptions as read from a .dc file.
Definition dcFile.h:32
A single molecular field of a Distributed Class, as read from a .dc file.
This is a block of data that receives the results of DCPacker.
Definition dcPackData.h:22
This object contains the names of all of the nested fields available within a particular field.
This defines the internal interface for packing values into a DCField.
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...
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.