1:
2:
3: /*************
4: * *
5: * SENTINEL *
6: * *
7: *************/
8:
9:
10: #ifndef WWWI_MIND_RDATA_H
11: #define WWWI_MIND_RDATA_H
12:
13:
14: /**********************
15: * *
16: * COMPILER INCLUDES *
17: * *
18: **********************/
19:
20:
21: #include <cassert>
22: #include <typeinfo>
23:
24:
25: /*********************
26: * *
27: * PROJECT INCLUDES *
28: * *
29: *********************/
30:
31:
32: #include "mind.h"
33: #include "buffer.h"
34: #include "ex.h"
35:
36:
37: using std::bad_cast;
38:
39:
40: /****************
41: * *
42: * CLASS RDATA *
43: * *
44: ****************/
45:
46: class RData;
47: DECL_POINTER_TYPES(RData)
48:
49: class RData {
50: public:
51: template <class T> inline T *As(void);
52: template <class T> inline const T *As(void) const;
53: virtual RDataPtr Clone(void) const = 0;
54: virtual bool Compare(const RData &ci_rdr) const = 0;
55: virtual void Dump(ostream &io_smr) const = 0;
56: virtual void ReadRData(BufferConstPtr ci_dpp) = 0;
57: virtual void SetRData(const char *ci_strRData) = 0;
58: virtual void WriteRData(BufferPtr io_dpp) const = 0;
59: static RDataPtr New(RRType i_ty, RRClass i_cl);
60: virtual ~RData(void);
61: };
62:
63:
64: /*********************
65: * *
66: * INLINE FUNCTIONS *
67: * *
68: *********************/
69:
70:
71: template <class T> inline
72: T *RData::As() {
73: T *tOut = dynamic_cast<T*>(this);
74: if (tOut == NULL) {
75: EX_BAD_CAST("RR asked for inappropriate RDATA type.");
76: }
77: return tOut;
78: }
79:
80: template <class T> inline
81: const T *RData::As() const {
82: const T *c_tOut = dynamic_cast<const T*>(this);
83: if (c_tOut == NULL) {
84: EX_BAD_CAST("RR asked for inappropriate RDATA type.");
85: }
86: return c_tOut;
87: }
88:
89:
90: /************
91: * *
92: * THE END *
93: * *
94: ************/
95:
96:
97: #endif
98:
99:
100: