Advertisement
Guest User

Untitled

a guest
Feb 14th, 2011
230
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.76 KB | None | 0 0
  1. #include "Value.h"
  2. #include <sstream>
  3.  
  4. std::string Value::error("Error converting!");
  5.  
  6. Value::operator std::string() const
  7. {
  8.     if(!m_data.size()) return error;
  9.     if(!m_data.front()->m_data) return error;
  10.     if(m_data.front()->m_type != TYPE_STRING) {
  11.         if(m_data.front()->m_type < TYPE_STRING) {
  12.             std::stringstream s;
  13.  
  14.             switch(m_data.front()->m_type) {
  15.                 case TYPE_INT:     
  16.                     {
  17.                         int32* i = (int32*)m_data.front()->m_data;
  18.                         int32 temp = *i;
  19.                         s << temp;
  20.                     } break;
  21.                 case TYPE_UINT:    
  22.                     {
  23.                         uint32* i = (uint32*)m_data.front()->m_data;
  24.                         uint32 temp = *i;
  25.                         s << temp;
  26.                     };break;
  27.                 case TYPE_CHAR:    
  28.                     {
  29.                         char* c = (char*)m_data.front()->m_data;
  30.                         char temp = *c;
  31.                         s << temp;
  32.                     } break;
  33.                 default: break;
  34.             }
  35.  
  36.             return s.str();
  37.  
  38.         } else return error;
  39.     }
  40.     return *static_cast<std::string*>(m_data.front()->m_data);
  41. }
  42.  
  43. Value::operator int32() const
  44. {
  45.     if (!m_data.size()) return 0;
  46.     if (!m_data.front()->m_data) return 0;
  47.     if (m_data.front()->m_type != TYPE_INT) {
  48.         return 0;
  49.     }
  50.     return *static_cast<int32*>(m_data.front()->m_data);
  51. }
  52.  
  53. Value::operator char() const
  54. {
  55.     if (!m_data.size()) return 0;
  56.     if (!m_data.front()->m_data) return 0;
  57.     if (m_data.front()->m_type != TYPE_CHAR) {
  58.         return 0;
  59.     }
  60.     return *static_cast<char*>(m_data.front()->m_data);
  61. }
  62. Value::operator uint32() const
  63. {
  64.     if (!m_data.front()) return 0;
  65.     if (!m_data.front()->m_data) return 0;
  66.     switch (m_data.front()->m_type)
  67.     {
  68.     case TYPE_INT:
  69.     case TYPE_UINT:
  70.     case TYPE_CHAR:
  71.         return *static_cast<uint32*>(m_data.front()->m_data);
  72.     default: return 0;
  73.     }
  74. }
  75.  
  76. Value::~Value()
  77. {
  78.     Clear();
  79. }
  80.  
  81. void Value::Clear()
  82. {
  83.     if(m_data.size()) {
  84.         for (std::list<Data*>::iterator  i = m_data.begin(); i!=m_data.end(); i++) {
  85.             delete *i;
  86.         }
  87.         m_data.clear();
  88.     }
  89. }
  90.  
  91. std::ostream& operator<<( std::ostream& os, const Value& value )
  92. {
  93.     const std::list<Value::Data*>& m_data = value.m_data;
  94.  
  95.     if(!m_data.size()) return os;
  96.     if(!m_data.front()->m_data) return os;
  97.  
  98.  
  99.     for (std::list<Value::Data*>::const_iterator i = m_data.begin(); i != m_data.end(); i++) {
  100.  
  101.         switch((*i)->m_type) {
  102.             case Value::TYPE_STRING:    os << *static_cast<std::string*>((*i)->m_data); break;
  103.             case Value::TYPE_INT:       os << *static_cast<int*>        ((*i)->m_data); break;
  104.             case Value::TYPE_UINT:      os << *static_cast<uint32*>     ((*i)->m_data); break;
  105.             case Value::TYPE_CHAR:      os << *static_cast<char*>       ((*i)->m_data); break;
  106.             default: break;
  107.         }
  108.         os << std::endl;
  109.     }
  110.  
  111.     return os;
  112. }
  113.  
  114.  
  115.  
  116. Value::Data::~Data()
  117. {
  118.     if(m_data){
  119.         switch(m_type) {
  120.                     case TYPE_STRING: delete static_cast<std::string*>(m_data); break;
  121.                     case TYPE_INT:    delete static_cast<int*>(m_data); break;
  122.                     case TYPE_UINT:   delete static_cast<uint32*>(m_data); break;
  123.                     case TYPE_CHAR:   delete static_cast<char*>(m_data); break;
  124.                     default: break;
  125.         }
  126.     }
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement