]> pilppa.org Git - lib1wire.git/blobdiff - src/Data.cc
Refactoring and fixes.
[lib1wire.git] / src / Data.cc
index c964bc411f3f2d8763aeec3a135763a69b8d2d22..e81039b13bc039f040d0f0f6f9d21a29aff43a5f 100644 (file)
@@ -8,6 +8,7 @@
 #include <string>
 #include <iostream>
 #include <sstream>
+#include <iomanip>
 
 #include <stdio.h>
 #include <time.h>
@@ -24,7 +25,7 @@ using namespace w1;
 
 template <class NumberDataType>
 bool string_to_number(NumberDataType& result,
-                 const std::string& string_param,
+                 const string& string_param,
                  std::ios_base& (*format)(std::ios_base&))
 {
        std::istringstream iss(string_param);
@@ -35,35 +36,68 @@ Data::Data(int size) {
        value_arr.resize(size);
 }
 
-Data::Data(int size, double default_value) {
+Data::Data(int size, double default_value, string unit_param) {
        int ii;
 
        value_arr.resize(size);
        for (ii = 0; ii < size; ii++) {
                value_arr[ii]   = default_value;
        }
+       unit    = unit_param;
 }
 
-Data::Data(vector<double> vector_param, Date *date_param) {
+Data::Data(vector<double> *vect_param) {
+       unsigned int    ii;
+       unsigned int    sz;
+
+       sz      = vect_param->size();
+       //log_debug("Data(), value count: %d\n", size);
+       value_arr.resize(sz);
+       for (ii = 0; ii < sz; ii++) {
+               value_arr[ii]   = vect_param->at(ii);
+               //log_debug("Data(), value[%d]: %f\n", ii, value_arr[ii]);
+       }
+}
+
+Data::Data(std::vector<double> *vector_param, string unit_param) {
+       unsigned int    ii;
+       unsigned int    sz;
+
+       sz      = vector_param->size();
+       //log_debug("Data(), value count: %d\n", size);
+       value_arr.resize(sz);
+       for (ii = 0; ii < sz; ii++) {
+               value_arr[ii]   = vector_param->at(ii);
+               //log_debug("Data(), value[%d]: %f\n", ii, value_arr[ii]);
+       }
+       unit    = unit_param;
+}
+
+Data::Data(vector<double> *vector_param,
+               Date *date_param,
+               string unit_param) {
        unsigned int    ii;
        unsigned int    size;
 
-       size    = vector_param.size();
+       size    = vector_param->size();
        //log_debug("Data(), value count: %d\n", size);
        value_arr.resize(size);
-       for (ii = 0; ii < vector_param.size(); ii++) {
-               value_arr[ii]   = vector_param.at(ii);
+       for (ii = 0; ii < size; ii++) {
+               value_arr[ii]   = vector_param->at(ii);
                //log_debug("Data(), value[%d]: %f\n", ii, value_arr[ii]);
        }
        date_time.copy(date_param);
+       unit    = unit_param;
 }
 
-Data::Data(std::valarray<double> value_arr_param, Date *date_param) {
-       unsigned int ii;
+Data::Data(std::valarray<double> *val_arr_param, Date *date_param) {
+       unsigned int    ii;
+       unsigned int    sz;
 
-       value_arr.resize(value_arr_param.size());
-       for (ii = 0; ii < value_arr_param.size(); ii++) {
-               value_arr[ii]   = value_arr_param[ii];
+       sz      = val_arr_param->size();
+       value_arr.resize(sz);
+       for (ii = 0; ii < sz; ii++) {
+               value_arr[ii]   = (*val_arr_param)[ii];
        }
        date_time.copy(date_param);
 }
@@ -74,38 +108,41 @@ Data::~Data() {
 Data *Data::clone() {
        Data    *ret_val;
 
-       ret_val = new Data(value_arr, &date_time);
+       ret_val = new Data(&value_arr, &date_time);
        return ret_val;
 }
 
+void Data::printout() {
+       log_debug("  data: %s\n", to_string().c_str());
+}
+
 plp::Date Data::get_date() {
        return date_time;
 }
 
-void Data::set_date(plp::Date date) {
-       date_time.copy(&date);
+void Data::set_date(Date *date_param) {
+       date_time.copy(date_param);
 }
 
-void Data::printout() {
-       unsigned int    ii;
-
-       date_time.printout();
-       for (ii = 0; ii < value_arr.size(); ii++) {
-               log_debug("  data[%d] = %f\n", ii, value_arr[ii]);
-       }
+string Data::get_unit() {
+       return unit;
 }
 
-Data *Data::parse_data_string(const string& dataline) {
+Data *Data::parse_string(const string& dataline) {
        stringstream    ss(dataline);
        string          item;
        double          val;
        Data            *ret_val;
        int             ii;
+       int             sz;
        bool            suc_flg;
        vector<double>  v;
+       string          unit;
        Date            date;
 
        ii      = 0;
+       ret_val = NULL;
+       log_debug("parse_string: %s\n", dataline.c_str());
        while(getline(ss, item, '|')) {
                if (ii == 0) {
                        // parse date
@@ -114,27 +151,60 @@ Data *Data::parse_data_string(const string& dataline) {
                else if (ii >= 1) {
                        suc_flg = string_to_number<double>(val, item, dec);
                        if (suc_flg) {
-                               //log_debug("adding number: %f\n", val);
+                               log_debug("adding number: %f\n", val);
                                v.push_back(val);
                        }
                }
                ii++;
        }
-       ret_val = new Data(v, &date);
+       ii      = item.find_last_of(" ");
+       sz      = item.size();
+       if ((ii >= 0) &&
+           ((ii + 1) <= (sz - 1))) {
+               unit    = item.substr(ii + 1);
+       }
+       else {
+               unit    = "";
+       }
+       if (v.size() > 0) {
+               ret_val = new Data(&v, &date, unit);
+       }
+       return ret_val;
+}
+
+string Data::to_string() {
+       unsigned int    ii;
+       ostringstream   out;
+       string          ret_val;
+
+       ret_val = date_time.to_string();
+       if (value_arr.size() > 0) {
+               for (ii = 0; ii < value_arr.size(); ii++) {
+                       out << fixed << setprecision(3) << value_arr[ii];
+                       ret_val.append("|");
+                       ret_val.append(out.str());
+               }
+               if (unit.empty() == false) {
+                       ret_val.append(" ");
+                       ret_val.append(unit.c_str());
+               }
+       }
        return ret_val;
 }
 
-DataRange::DataRange(int value_count_per_data_item) {
+DataRange::DataRange(Data *data) {
        val_matrix      = NULL;
-       column_count    = value_count_per_data_item;
+       column_count    = data->value_arr.size();
        row_count       = 0;
+       unit            = data->get_unit();
+       add_data(data);
 }
 
-DataRange::DataRange(Data data) {
+DataRange::DataRange(int value_count_per_data_item, string unit_param) {
        val_matrix      = NULL;
-       column_count    = data.value_arr.size();
+       column_count    = value_count_per_data_item;
        row_count       = 0;
-       add_data(data);
+       unit            = unit_param;
 }
 
 DataRange::~DataRange() {
@@ -151,24 +221,38 @@ DataRange::~DataRange() {
        }
 }
 
-void DataRange::add_data(Data data) {
-       unsigned int    ii;
-       int             indx;
-       Date            date;
+void DataRange::add_data(Data *data) {
+       int     ii;
+       int     indx;
+       Date    *date;
+       int     cnt;
 
        //log_debug("old row_count: %d, column_count: %d, value_arr_size: %d\n", row_count, column_count, data.value_arr.size());
-       val_matrix      = (double *)realloc(val_matrix, ((row_count + 1) * column_count) * sizeof(double));
+       cnt             = (row_count + 1) * column_count;
+       val_matrix      = (double *)realloc(val_matrix, cnt * sizeof(double));
        indx            = row_count * column_count;
-       for (ii = 0; ii < data.value_arr.size(); ii++) {
-               val_matrix[indx + ii]   = data.value_arr[ii];
+       cnt             = data->value_arr.size();
+       if (cnt != column_count) {
+               log_error("Error when adding data... Invalid data item count!\n");
+               if (cnt > column_count) {
+                       cnt     = column_count;
+               }
+               else {
+                       for (ii = cnt; ii < column_count; ii++) {
+                               val_matrix[indx + ii]   = 0;
+                       }
+               }
+       }
+       for (ii = 0; ii < cnt; ii++) {
+               val_matrix[indx + ii]   = data->value_arr[ii];
        }
 /*
        for (int ii = 0; ii < ((row_count + 1) * column_count); ii++) {
                log_debug("data_matrix[%d] = %f\n", ii, val_matrix[ii]);
        }
 */
-       date    = data.get_date();
-       date_list.push_back(date.clone());
+       date    = data->get_date().clone();
+       date_list.push_back(date);
        row_count++;
 }
 
@@ -176,18 +260,22 @@ Data *DataRange::get_data(int row_index) {
        Data            *ret_val;
        int             start_indx;
        int             ii;
-       vector<double>  vector;
+       vector<double>  vect;
        Date            *date;
+       double          val;
 
        ret_val = NULL;
        if ((row_index >= 0) &&
            (row_index < row_count)) {
                start_indx      = row_index * column_count;
                for (ii = 0; ii < column_count; ii++) {
-                       vector.push_back(val_matrix[start_indx + ii]);
+                       //val   = val_matrix[0];
+                       val     = val_matrix[start_indx + ii];
+                       log_debug("val[%d] = %f\n", (start_indx + ii), val);
+                       vect.push_back(val);
                }
                date    = date_list.at(row_index);
-               ret_val = new Data(vector, date);
+               ret_val = new Data(&vect, date, unit);
        }
        return ret_val;
 }