map_value.cc
author ladanyi
Wed, 02 Jan 2008 21:03:09 +0000
changeset 201 879e47e5b731
permissions -rw-r--r--
Merge branches/akos to trunk.
ladanyi@201
     1
#include "map_value.h"
ladanyi@201
     2
#include <sstream>
ladanyi@201
     3
#include <iostream>
ladanyi@201
     4
ladanyi@201
     5
MapValue::MapValue()
ladanyi@201
     6
{
ladanyi@201
     7
  //std::cout << __PRETTY_FUNCTION__ << std::endl;
ladanyi@201
     8
  has_value = false;
ladanyi@201
     9
}
ladanyi@201
    10
ladanyi@201
    11
MapValue::MapValue(double d)
ladanyi@201
    12
{
ladanyi@201
    13
  //std::cout << __PRETTY_FUNCTION__ << std::endl;
ladanyi@201
    14
  p_value = new double(d);
ladanyi@201
    15
  type = NUMERIC;
ladanyi@201
    16
  has_value = true;
ladanyi@201
    17
}
ladanyi@201
    18
ladanyi@201
    19
MapValue::MapValue(std::string str)
ladanyi@201
    20
{
ladanyi@201
    21
  //std::cout << __PRETTY_FUNCTION__ << std::endl;
ladanyi@201
    22
  p_value = new std::string(str);
ladanyi@201
    23
  type = STRING;
ladanyi@201
    24
  has_value = true;
ladanyi@201
    25
}
ladanyi@201
    26
ladanyi@201
    27
MapValue::MapValue(const char* str)
ladanyi@201
    28
{
ladanyi@201
    29
  //std::cout << __PRETTY_FUNCTION__ << std::endl;
ladanyi@201
    30
  p_value = new std::string(str);
ladanyi@201
    31
  type = STRING;
ladanyi@201
    32
  has_value = true;
ladanyi@201
    33
}
ladanyi@201
    34
ladanyi@201
    35
MapValue::operator double() const
ladanyi@201
    36
{
ladanyi@201
    37
  //std::cout << __PRETTY_FUNCTION__ << std::endl;
ladanyi@201
    38
  if (!has_value) throw IllegalOperation();
ladanyi@201
    39
  if (type == NUMERIC)
ladanyi@201
    40
    return *(static_cast<double*>(p_value));
ladanyi@201
    41
  else
ladanyi@201
    42
    throw IllegalOperation();
ladanyi@201
    43
}
ladanyi@201
    44
ladanyi@201
    45
MapValue::operator std::string() const
ladanyi@201
    46
{
ladanyi@201
    47
  //std::cout << __PRETTY_FUNCTION__ << std::endl;
ladanyi@201
    48
  if (!has_value) throw IllegalOperation();
ladanyi@201
    49
  std::string ret;
ladanyi@201
    50
  switch (type)
ladanyi@201
    51
  {
ladanyi@201
    52
    case NUMERIC:
ladanyi@201
    53
      {
ladanyi@201
    54
        double d = *(static_cast<double*>(p_value));
ladanyi@201
    55
        std::ostringstream ostr;
ladanyi@201
    56
        ostr << d;
ladanyi@201
    57
        ret = ostr.str();
ladanyi@201
    58
      }
ladanyi@201
    59
      break;
ladanyi@201
    60
    case STRING:
ladanyi@201
    61
      ret = *(static_cast<std::string*>(p_value));
ladanyi@201
    62
      break;
ladanyi@201
    63
  }
ladanyi@201
    64
  return ret;
ladanyi@201
    65
}
ladanyi@201
    66
ladanyi@201
    67
MapValue::MapValue(const MapValue& v)
ladanyi@201
    68
{
ladanyi@201
    69
  //std::cout << __PRETTY_FUNCTION__ << std::endl;
ladanyi@201
    70
  if (!v.has_value) throw IllegalOperation();
ladanyi@201
    71
  has_value = true;
ladanyi@201
    72
  type = v.type;
ladanyi@201
    73
  switch (v.type)
ladanyi@201
    74
  {
ladanyi@201
    75
    case NUMERIC:
ladanyi@201
    76
      p_value = new double(*(static_cast<double*>(v.p_value)));
ladanyi@201
    77
      break;
ladanyi@201
    78
    case STRING:
ladanyi@201
    79
      p_value = new std::string(*(static_cast<std::string*>(v.p_value)));
ladanyi@201
    80
      break;
ladanyi@201
    81
  }
ladanyi@201
    82
}
ladanyi@201
    83
ladanyi@201
    84
MapValue& MapValue::operator=(const MapValue& v)
ladanyi@201
    85
{
ladanyi@201
    86
  //std::cout << __PRETTY_FUNCTION__ << std::endl;
ladanyi@201
    87
  if (&v != this)
ladanyi@201
    88
  {
ladanyi@201
    89
    if (!v.has_value) throw IllegalOperation();
ladanyi@201
    90
    clear();
ladanyi@201
    91
    has_value = true;
ladanyi@201
    92
    type = v.type;
ladanyi@201
    93
    switch (v.type)
ladanyi@201
    94
    {
ladanyi@201
    95
      case NUMERIC:
ladanyi@201
    96
        p_value = new double(*(static_cast<double*>(v.p_value)));
ladanyi@201
    97
        break;
ladanyi@201
    98
      case STRING:
ladanyi@201
    99
        p_value = new std::string(*(static_cast<std::string*>(v.p_value)));
ladanyi@201
   100
        break;
ladanyi@201
   101
    }
ladanyi@201
   102
  }
ladanyi@201
   103
  return *this;
ladanyi@201
   104
}
ladanyi@201
   105
ladanyi@201
   106
MapValue::~MapValue()
ladanyi@201
   107
{
ladanyi@201
   108
  //std::cout << __PRETTY_FUNCTION__ << std::endl;
ladanyi@201
   109
  clear();
ladanyi@201
   110
}
ladanyi@201
   111
ladanyi@201
   112
void MapValue::clear()
ladanyi@201
   113
{
ladanyi@201
   114
  //std::cout << __PRETTY_FUNCTION__ << std::endl;
ladanyi@201
   115
  if (!has_value) return;
ladanyi@201
   116
  switch (type)
ladanyi@201
   117
  {
ladanyi@201
   118
    case NUMERIC:
ladanyi@201
   119
      delete static_cast<double*>(p_value);
ladanyi@201
   120
      break;
ladanyi@201
   121
    case STRING:
ladanyi@201
   122
      delete static_cast<std::string*>(p_value);
ladanyi@201
   123
      break;
ladanyi@201
   124
  }
ladanyi@201
   125
}
ladanyi@201
   126
ladanyi@201
   127
MapValue::Type MapValue::getType() const
ladanyi@201
   128
{
ladanyi@201
   129
  //std::cout << __PRETTY_FUNCTION__ << std::endl;
ladanyi@201
   130
  return type;
ladanyi@201
   131
}
ladanyi@201
   132
ladanyi@201
   133
bool MapValue::hasValue() const
ladanyi@201
   134
{
ladanyi@201
   135
  //std::cout << __PRETTY_FUNCTION__ << std::endl;
ladanyi@201
   136
  return has_value;
ladanyi@201
   137
}
ladanyi@201
   138
ladanyi@201
   139
std::ostream& operator<<(std::ostream &os, const MapValue& v)
ladanyi@201
   140
{
ladanyi@201
   141
  //std::cout << __PRETTY_FUNCTION__ << std::endl;
ladanyi@201
   142
  if (!v.has_value) return os;
ladanyi@201
   143
  switch (v.type)
ladanyi@201
   144
  {
ladanyi@201
   145
    case MapValue::NUMERIC:
ladanyi@201
   146
      os << *(static_cast<double*>(v.p_value));
ladanyi@201
   147
      break;
ladanyi@201
   148
    case MapValue::STRING:
ladanyi@201
   149
      os << *(static_cast<std::string*>(v.p_value));
ladanyi@201
   150
      break;
ladanyi@201
   151
  }
ladanyi@201
   152
  return os;
ladanyi@201
   153
}