Program Listing for File Scale.h

Program Listing for File Scale.h#

Return to documentation for file (src/main/cpp/lib/Scale.h)

#ifndef SCALE_H_
#define SCALE_H_

#include <cmath>
#include <cstddef>
#include <vector>
#include <sstream>
#include "Label.h"

std::pair<double, double>
create_rounded_interval (double min, double max);


class Scale
{
protected:
  size_t m_major_intersections;
  size_t m_minor_intersections;
  TextProperties m_label_prop;
  std::string m_label_suffix;
public:
  Scale (size_t major_intersections, size_t minor_intersections,
     const TextProperties& label_prop, const std::string& label_suffix = "") :
      m_major_intersections (major_intersections), m_minor_intersections (
      minor_intersections), m_label_prop (label_prop), m_label_suffix (
      label_suffix)
  {
  }

  virtual
  ~Scale ()
  {
  }

  size_t
  get_major_intersections (void) const
  {
    return m_major_intersections;
  }

  size_t
  get_minor_intersections (void) const
  {
    return m_minor_intersections;
  }
};

class SimpleScale : public Scale
{
private:
  std::pair<double, double> m_extremes;
public:
  SimpleScale (size_t major_intersections, size_t minor_intersections,
           const std::pair<double, double>& extremes,
           const TextProperties& label_prop,
           const std::string& label_suffix = "") :
      Scale (major_intersections, minor_intersections, label_prop,
         label_suffix), m_extremes (create_rounded_interval(extremes.first, extremes.second))
  {
  }

  inline const std::pair<double, double> &
  get_extremes () const
  {
    return m_extremes;
  }

  std::vector<Label>
  make_labels (void) const;
};

class MultiScale : public Scale
{
private:
  std::vector<std::pair<double, double>> m_extremes;
public:
  MultiScale (size_t ticks_major, size_t ticks_minor,
          const TextProperties& label_prop,
          const std::string& label_suffix = "") :
      Scale (ticks_major, ticks_minor, label_prop, label_suffix)
  {
  }

  inline void
  add_scale (const std::pair<double, double>& extremes)
  {
    m_extremes.push_back (create_rounded_interval(extremes.first, extremes.second));
  }

  inline size_t
  get_scale_number (void) const
  {
    return m_extremes.size ();
  }

  inline const std::pair<double, double> &
  get_extremes (size_t i) const
  {
    return m_extremes[i];
  }

  std::vector<Label>
  make_labels (size_t i) const;
};

#endif /* TICKS_H_ */