Commit 204df769 authored by Paul Asmuth's avatar Paul Asmuth
Browse files

add a Series type for storing string and numeric data

parent fb3ed15f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ add_library(plotfxlib STATIC
    common/graphics/font_lookup.cc
    common/element_factory.cc
    common/document.cc
    common/series.cc
    common/utils/random.cc
    common/utils/csv.cc
    common/utils/bufferutil.cc
+6 −19
Original line number Diff line number Diff line
@@ -36,7 +36,7 @@ namespace plotfx {

ReturnCode parse_data_series_csv(
    const plist::Property& prop ,
    std::vector<double>* data) {
    Series* data) {
  if (!plist::is_enum(prop, "csv")) {
    return ERROR_INVALID_ARGUMENT;
  }
@@ -72,13 +72,7 @@ ReturnCode parse_data_series_csv(

  for (const auto& row : csv_data) {
    if (row.size() > csv_column_idx) {
      double value;
      try {
        value = std::stod(row[csv_column_idx]);
      } catch (... ) {
        return ERROR_INVALID_ARGUMENT; // FIXME
      }

      const auto& value = row[csv_column_idx];
      data->emplace_back(value);
    }
  }
@@ -88,28 +82,21 @@ ReturnCode parse_data_series_csv(

ReturnCode parse_data_series_inline(
    const plist::Property& prop ,
    std::vector<double>* data) {
    Series* data) {
  if (!plist::is_list(prop)) {
    return ERROR_INVALID_ARGUMENT;
  }

  for (const auto& v : *prop.next) {
    double value;
    try {
      value = std::stod(v);
    } catch (... ) {
      return ERROR_INVALID_ARGUMENT;
    }

  for (const auto& value : *prop.next) {
    data->emplace_back(value);
  }

  return OK;
}

ReturnCode parseDataSeries(
ReturnCode configure_series(
    const plist::Property& prop,
    std::vector<double>* data) {
    Series* data) {
  if (plist::is_enum(prop, "csv")) {
    return parse_data_series_csv(prop, data);
  }
+3 −2
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@
#include <graphics/measure.h>
#include <graphics/colour.h>
#include "utils/return_code.h"
#include "common/series.h"

namespace plotfx {

@@ -86,9 +87,9 @@ ReturnCode parse_classlike(

ParserFn configure_multiprop(const std::vector<ParserFn>& parsers);

ReturnCode parseDataSeries(
ReturnCode configure_series(
    const plist::Property& prop,
    std::vector<double>* data);
    Series* data);

ReturnCode parseMeasureProp(
    const plist::Property& prop,
+21 −8
Original line number Diff line number Diff line
@@ -36,7 +36,8 @@ DomainConfig::DomainConfig() :
    inverted(false),
    padding(0.0f) {}

void domain_fit(const std::vector<double>& data, DomainConfig* domain, bool snap_zero) {
void domain_fit_linear(const Series& data_raw, DomainConfig* domain, bool snap_zero) {
  auto data = series_to_float(data_raw);
  bool fit_min = !domain->min;
  bool fit_max = !domain->max;

@@ -65,16 +66,19 @@ void domain_fit(const std::vector<double>& data, DomainConfig* domain, bool snap
  }
}

double domain_translate(const DomainConfig& domain, double v) {
void domain_fit(const Series& data, DomainConfig* domain, bool snap_zero) {
  switch (domain->kind) {
    case DomainKind::LINEAR:
      return domain_fit_linear(data, domain, snap_zero);
  }
}

double domain_translate_linear(const DomainConfig& domain, const Value& v) {
  auto min = domain.min.value_or(0.0f);
  auto max = domain.max.value_or(0.0f);

  auto vt = 0.0;
  switch (domain.kind) {
    case DomainKind::LINEAR:
      vt = (v - min) / (max - min);
      break;
  }
  auto vf = value_to_float(v);
  auto vt = (vf - min) / (max - min);

  if (domain.inverted) {
    vt = 1.0 - vt;
@@ -83,6 +87,15 @@ double domain_translate(const DomainConfig& domain, double v) {
  return vt;
}

double domain_translate(const DomainConfig& domain, const Value& v) {
  switch (domain.kind) {
    case DomainKind::LINEAR:
      return domain_translate_linear(domain, v);
  }

  return 0;
}

double domain_untranslate(const DomainConfig& domain, double vt) {
  auto min = domain.min.value_or(0.0f);
  auto max = domain.max.value_or(0.0f);
+5 −3
Original line number Diff line number Diff line
@@ -34,6 +34,9 @@
#include <vector>
#include <string>
#include <optional>
#include "utils/return_code.h"
#include "plist/plist.h"
#include "common/series.h"

namespace plotfx {

@@ -50,10 +53,9 @@ struct DomainConfig {
  double padding;
};

void domain_fit(const std::vector<double>& data, DomainConfig* domain, bool snap_zero);

double domain_translate(const DomainConfig& domain, double v);
void domain_fit(const Series& data, DomainConfig* domain, bool snap_zero);

double domain_translate(const DomainConfig& domain, const Value& v);
double domain_untranslate(const DomainConfig& domain, double v);

} // namespace plotfx
Loading