#ifndef WWWI_MIND_RDATA_H
#define WWWI_MIND_RDATA_H
#include <cassert>
#include <typeinfo>
#include "mind.h"
#include "buffer.h"
#include "ex.h"
using std::bad_cast;
class RData;
DECL_POINTER_TYPES(RData)
class RData {
public:
template <class T> inline T *As(void);
template <class T> inline const T *As(void) const;
virtual RDataPtr Clone(void) const = 0;
virtual bool Compare(const RData &ci_rdr) const = 0;
virtual void Dump(ostream &io_smr) const = 0;
virtual void ReadRData(BufferConstPtr ci_dpp) = 0;
virtual void SetRData(const char *ci_strRData) = 0;
virtual void WriteRData(BufferPtr io_dpp) const = 0;
static RDataPtr New(RRType i_ty, RRClass i_cl);
virtual ~RData(void);
};
template <class T> inline
T *RData::As() {
T *tOut = dynamic_cast<T*>(this);
if (tOut == NULL) {
EX_BAD_CAST("RR asked for inappropriate RDATA type.");
}
return tOut;
}
template <class T> inline
const T *RData::As() const {
const T *c_tOut = dynamic_cast<const T*>(this);
if (c_tOut == NULL) {
EX_BAD_CAST("RR asked for inappropriate RDATA type.");
}
return c_tOut;
}
#endif