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: