Trading System API  3.0
Library for Simulating and Deploying Trading and Investment Strategies
TSASeriesTemplate.h
1 /* ===================================================================
2 *
3 * T R A D I N G S Y S T E M A P I ™
4 * Copyright © 1999 - 2014 by Peter Ritter ( TradingSystemAPI.com )
5 * A L L R I G H T S R E S E R V E D
6 *
7 * Consult your license regarding permissions and restrictions.
8 * You may obtain a copy of the License at:
9 * http://www.TradingSystemAPI.com/licenses/LICENSE-TSAPI-3.0.html
10 *
11 * ====================================================================
12 */
13 
14 #ifndef TSA_SERIES_TEMPLATE2__INCLUDED
15 #define TSA_SERIES_TEMPLATE2__INCLUDED
16 
17 #include <vector>
18 #include <iostream>
19 #include <initializer_list>
20 
21 #include "TSATypeDef.h"
22 #include "TSAVariant.h"
23 #include "TSAString.h"
24 #include "TSAError.h"
25 #include "TSASimBaseSeries.h"
26 #include "TSASeriesProxy.h"
27 #include "TSASeriesImp.h"
28 #include "TSAStrategyPtr.h"
29 
30 namespace tsa {
31  class in_stream;
32  class out_stream;
33  //class string;
34  class date_time;
35  class series_base;
36  class strategy;
37  class managed_series;
38  class in_stream_adaptor;
39  class column_defs;
40  class auto_series;
41 
46  void verify_non_zero(size_t value);
47 
52  void verify_non_zero(double value);
53 
54  namespace functor {
55  class functor_parent_base;
56  }
57 
58  template<typename TYPE> class series_cref;
59 
60  /*
61  ** ====================================================
62  ** >>> class series_core <<<
63  ** ====================================================
64  */
65  // Internal
66  class dll_export series_core : public tsa::object {
67  tsa_declare_testable;
68  protected:
69  functor::functor_parent_base* m_functor_ptr = nullptr;
70  size_t m_functor_output_pos = 0;
71  strategy* m_strategy_ptr;
72  identifier_t m_id;
73  managed_series* m_managed_series_ptr;
74  type_t m_type;
75  date_time m_timestamp_of_current_value;
76  private:
77  void verify_init() const;
78  public:
79  void reset(void);
80  public:
81  void copy_members(const series_core&);
82  void push_front(const variant&, const date_time&);
83  const date_time& most_recent_timestamp(void) const;
84  public:
85  series_core(void);
86  series_core(size_t capacity, type_t _dt);
87  explicit series_core(type_t);
88  public:
89  series_core(const series_core&);
90  series_core(const series_core*);
91  bool is_init(void) const;
92  type_t type(void) const;
93  virtual ~series_core(void);
94  void Init(void);
95  void verify_size(size_t) const;
96  bool size_ok(size_t)const;
97  size_t get_required_size(void) const;
98  public:
99  size_t Size(void) const;
100  const variant& at(size_t idx) const;
101  const variant& at__noexcept(size_t idx) const;
102 
103  void* data(void) const;
104  const variant& operator()(void) const;
105  public:
106  const variant& operator[](size_t idx) const;
107  public:
108  functor::functor_parent_base* functor_ptr(void)const;
109  size_t functor_output_pos(void)const;
110  public:
111  void SetSource(const std::string& _s);
112  const std::string& name(void) const;
113  identifier_t id(void) const;
114  };
115 
118  class series_template_base : public tsa::object {
119  public:
120  virtual ~series_template_base(void) { ; }
121  virtual variant at(size_t)const = 0;
122  virtual bool size_ok(size_t)const = 0;
123  };
124 
125  /*
126  ** ====================================================
127  ** >>> plot_info <<<
128  ** ====================================================
129  */
130  template<typename T> class series_cref;
131  template<typename T> class series_tuple;
132 
136  struct h_line {
137  tsa::color clr;
138  double y_value;
139  unsigned weight;
141  h_line(void);
143  h_line(const tsa::color& c, double y_value, int weight);
144  };
145 
149  enum class plot_type {
151  line,
153  area,
155  bar
156  };
157 
161  struct plot_info {
162  std::string name;
163  bool plot_it = true;
164  plot_type type = plot_type::line;
166  unsigned weight = 2;
167  std::string period_to_string(const tsa::variant&);
168  public:
169  std::string period_string;
171  void period(const tsa::variant& period0, const tsa::variant& period1 = variant(),
172  const tsa::variant& period2 = variant(), const tsa::variant& period3 = variant());
173  };
174 
178  class pane_format {
179  public:
181  void pane_h_line(const h_line& hl)const { m_h_lines.push_back(hl); }
183  void pane_h_line(const tsa::color& c, double y_value, int weight)const
185  {
186  m_h_lines.push_back({ c, y_value, weight });
187  }
189  void pane_y_max(double max)const { m_pane_y_max = max; }
191  void pane_y_min(double min)const { m_pane_y_min = min; }
193  void pane_show_grid(bool b)const { m_show_grid = b; }
195  void pane_dotted_grid(bool b)const { m_dotted_grid = b; }
197  void pane_grid_color(const tsa::color& c)const { m_grid_color = c; }
199  void pane_auto_pane(bool b)const { m_auto_pane = b; }
201  const std::vector<tsa::h_line>& pane_h_lines(void)const { return m_h_lines; }
203  const variant& pane_y_max(void)const { return m_pane_y_max; }
205  const variant& pane_y_min(void)const { return m_pane_y_min; }
207  void copy_pane_format(const pane_format& other)const {
208  m_h_lines = other.m_h_lines;
209  m_pane_y_max = other.m_pane_y_max;
210  m_pane_y_min = other.m_pane_y_min;
211  m_show_grid = other.m_show_grid;
212  m_dotted_grid = other.m_dotted_grid;
213  m_grid_color = other.m_grid_color;
214  m_auto_pane = other.m_auto_pane;
215  }
216  private:
217  mutable std::vector<tsa::h_line> m_h_lines;
218  mutable variant m_pane_y_max;
219  mutable variant m_pane_y_min;
220  mutable variant m_show_grid;
221  mutable variant m_dotted_grid;
222  mutable tsa::color m_grid_color;
223  mutable variant m_auto_pane;
224 
225  template<typename T> friend class series_cref;
226  template<typename T> friend class series_tuple;
227  };
228 
229  /*
230  ** ====================================================
231  ** >>> class series <<<
232  ** ====================================================
233  */
234 
237  template<typename T = double>
238  class dll_export series
239  : public series_template_base,
240  public pane_format {
241  tsa_declare_testable;
242  private:
243  series_core m_core;
244  static size_t m_default_capacity;
245  public:
246 
251  static void reset_default_capacity(size_t new_capacity) {
252  m_default_capacity = new_capacity;
253  if (m_default_capacity == 0) { m_default_capacity = 1; }
254  }
256  static size_t default_capacity(void) { return m_default_capacity; }
257  private:
258  series_imp<T>* m_series_imp_ptr = nullptr;
259  size_t m_shift;
260  bool m_is_owner = false;
261  bool m_is_nonexistant_auto_series = false;//false for auto_series with no source
262  bool m_was_assigned_in_DSP = false;
263  functor::functor_parent_base* m_functor_ptr = nullptr;
264  mutable std::string m_auto_series_name;
265  private:
266  mutable plot_info m_plot_info;
267  public:
269  void plot_info(const plot_info& pi)const { m_plot_info = pi; }
271  const tsa::plot_info& plot_info(void)const { return m_plot_info; }
272 
281  void plot_as(const std::string& name, const tsa::variant& period = 0.0,
282  plot_type type = plot_type::line, tsa::color clr = tsa::color::auto_color, unsigned weight = 2)const {
283  tsa::plot_info pi;
284  pi.name = name;
285  pi.period(period);
286  pi.type = type;
287  pi.clr = clr;
288  pi.weight = weight;
289  plot_info(pi);
290  }
291 
300  void plot_as(const std::string& name, const std::vector<tsa::variant>& periods,
301  plot_type type = plot_type::line, tsa::color clr = tsa::color::auto_color, unsigned weight = 2)const {
302  tsa::plot_info pi;
303  pi.name = name;
304  std::vector<tsa::variant> adj_periods = periods;
305  adj_periods.resize(4, variant());
306  tsa_assert(adj_periods.size() == 4);
307 
308  pi.period(adj_periods[0], adj_periods[1], adj_periods[2], adj_periods[3]);
309  pi.type = type;
310  pi.clr = clr;
311  pi.weight = weight;
312  plot_info(pi);
313  }
314  public:
315  const series<T>& name(const std::string& name)const;
316  const std::string& name(void)const { return m_auto_series_name; }
317  public:
318  void set_owning_functor_ptr(functor::functor_parent_base* ptr) { m_functor_ptr = ptr; }
319  functor::functor_parent_base* owning_functor_ptr(void)const { return m_functor_ptr; }
320  public:
321  // Internal use: Copy Constructor that shifts the series backward by @a shift_ places.
322  series(const series& other, size_t shift_);
323  public:
324 
329  series(const series_core&);
330  void init_as_auto_series(const series_core&, const std::string& field_name);
331  public:
332 
337  series(const std::string& auto_series_name) : series(nullptr, false) {
338  m_auto_series_name = auto_series_name;
339  m_is_nonexistant_auto_series = true;
340  }
341 
343  series(const std::initializer_list<T>& init_list) : series(nullptr, false){
344  for (auto i = std::rbegin(init_list); i != std::rend(init_list); i++){
345  push(*i);
346  }
347  }
348 
352  series(void) : series(nullptr, false) { ; }
353  // Internal
354  series(functor::functor_parent_base* ftor_ptr, bool called_by_series_ref_constr = false);
355 
360  series(const series<T>& other);
361 
366  explicit series(size_t capacity);
367 
371  virtual ~series(void);
373  type_t type(void) const { return m_core.type(); }
374  public:
376  void operator=(series_cref<T>&);
378  void operator=(const series<T>& other);
379 
385  void reserve(size_t capacity);
386 
392  size_t capacity(void) const;
393 
398  bool is_managed(void) const;
399 
404  bool is_owner(void) const { return m_is_owner; }
405 
411  T get_at(size_t position) const;
412  virtual variant at(size_t pos)const { return variant(get_at(pos)); }
413  T get_at_no_exc(size_t position) const;
414 
420  T operator[](size_t position) const;
421 
423  series_cref<T> operator()(size_t shift_by) const { return SHIFT(*this, shift_by); }
424 
430  void push(T);
431 
437  void push(const variant&);
438  // Internal use
439  void _internal_push(T);
440 
446  const T* data(void) const;
447  T* data_non_const(void);
448 
453  size_t size(void) const;
454 
464  const series<T> shift(size_t _shift_by) const;
465 
474  void set_size(size_t new_size);
475 
481  bool is_equal(const series<T>& other) const;
482 
488  void verify_size(size_t reqired_size) const;
489 
495  virtual bool size_ok(size_t _required_size)const;
496 
501  bool empty(void)const { return size() == 0; }
502 
506  void clear(void);
507 
512  void fill_to_capacity(T value);
513 
521  void copy(const series& other, size_t max_num_values = ~(size_t)0);
522  public:
523 
529  bool crosses_above(const series<T>& other) const;
530 
536  bool crosses_below(const series<T>& other) const;
537 
543  bool crosses_above(double threshold) const;
544 
550  bool crosses_below(double threshold) const;
551 
556  type_t value_type(void) const;
557  void raise_type_mismatch(void);
558 
559  //IU
560  void CopyTo(std::vector<T>&, size_t);
561 
569  void print(std::ostream& stream, size_t max = 1000);
570 
578  void print_v(std::ostream& s, size_t max = 1000);
579  public:
580  class const_iterator;
581  // iterator class
582  class iterator : public std::iterator
583  < std::random_access_iterator_tag, T > {
584  private:
585  T* m_ptr;
586  friend class const_iterator;
587  public:
588  iterator() : m_ptr(NULL) {}
589  iterator(T* p) : m_ptr(p) {}
590  iterator(const iterator& other) : m_ptr(other.m_ptr) {}
591  const iterator& operator= (const iterator& other) { m_ptr = other.m_ptr; return other; }
592 
593  iterator& operator++() { m_ptr++; return *this; } // prefix++
594  iterator operator++ (int) { iterator tmp(*this); ++(*this); return tmp; } // postfix++
595  iterator& operator--() { m_ptr--; return *this; } // prefix--
596  iterator operator-- (int) { iterator tmp(*this); --(*this); return tmp; } // postfix--
597 
598  void operator+= (const std::size_t& n) { m_ptr += n; }
599  void operator+= (const iterator& other) { m_ptr += other.m_ptr; }
600  iterator operator+ (const std::size_t& n) { iterator tmp(*this); tmp += n; return tmp; }
601  iterator operator+ (const iterator& other) { iterator tmp(*this); tmp += other; return tmp; }
602 
603  void operator-= (const std::size_t& n) { m_ptr -= n; }
604  void operator-= (const iterator& other) { m_ptr -= other.m_ptr; }
605  iterator operator- (const std::size_t& n) { iterator tmp(*this); tmp -= n; return tmp; }
606  std::size_t operator- (const iterator& other) { return m_ptr - other.m_ptr; }
607 
608  bool operator< (const iterator& other) { return (m_ptr - other.m_ptr) < 0; }
609  bool operator<= (const iterator& other) { return (m_ptr - other.m_ptr) <= 0; }
610  bool operator> (const iterator& other) { return (m_ptr - other.m_ptr) > 0; }
611  bool operator>= (const iterator& other) { return (m_ptr - other.m_ptr) >= 0; }
612  bool operator== (const iterator& other) { return m_ptr == other.m_ptr; }
613  bool operator!= (const iterator& other) { return m_ptr != other.m_ptr; }
614 
615  T& operator[](const int& n) { return *(m_ptr + n); }
616  T& operator*() { return *m_ptr; }
617  T* operator->() { return m_ptr; }
618  };
619 
620  // const_iterator class
621  class const_iterator : public std::iterator
622  < std::random_access_iterator_tag, T > {
623  private:
624  const T* m_ptr;
625  public:
626  const_iterator() : m_ptr(NULL) {}
627  const_iterator(const T* p) : m_ptr(p) {}
628  const_iterator(const iterator& other) : m_ptr
629  (other.p_) {}
630  const_iterator(const const_iterator& other) : m_ptr
631  (other.m_ptr) {}
632  const const_iterator& operator= (const const_iterator&
633  other) {
634  m_ptr = other.m_ptr; return other;
635  }
636  const const_iterator& operator= (const iterator& other) { m_ptr = other.p_; return other; }
637 
638  const_iterator& operator++() { m_ptr++; return *this; } // prefix++
639  const_iterator operator++ (int) { const_iterator tmp(*this); ++(*this); return tmp; } // postfix++
640  const_iterator& operator--() { m_ptr--; return *this; } // prefix--
641  const_iterator operator-- (int) { const_iterator tmp(*this); --(*this); return tmp; } // postfix--
642 
643  void operator+= (const std::size_t& n) { m_ptr += n; }
644  void operator+= (const const_iterator& other) { m_ptr += other.m_ptr; }
645  const_iterator operator+ (const std::size_t& n)
646  const {
647  const_iterator tmp(*this); tmp += n; return tmp;
648  }
649  const_iterator operator+ (const const_iterator& other)
650  const {
651  const_iterator tmp(*this); tmp += other; return tmp;
652  }
653 
654  void operator-= (const std::size_t& n) { m_ptr -= n; }
655  void operator-= (const const_iterator& other) { m_ptr -= other.m_ptr; }
656  const_iterator operator- (const std::size_t& n)
657  const {
658  const_iterator tmp(*this); tmp -= n; return tmp;
659  }
660  std::size_t operator- (const const_iterator& other)
661  const {
662  return m_ptr - other.m_ptr;
663  }
664 
665  bool operator< (const const_iterator& other) const { return (m_ptr - other.m_ptr) < 0; }
666  bool operator<= (const const_iterator& other) const { return (m_ptr - other.m_ptr) <= 0; }
667  bool operator> (const const_iterator& other) const { return (m_ptr - other.m_ptr) > 0; }
668  bool operator>= (const const_iterator& other) const { return (m_ptr - other.m_ptr) >= 0; }
669  bool operator== (const const_iterator& other) const { return m_ptr == other.m_ptr; }
670  bool operator!= (const const_iterator& other) const { return m_ptr != other.m_ptr; }
671 
672  const T& operator[](const int& n) const { return *(m_ptr + n); }
673  const T& operator*() const { return *m_ptr; }
674  const T* operator->() const { return m_ptr; }
675  };
676 
677  public:
678  iterator begin() { return iterator(data_non_const()); }
679  iterator end() { return iterator(data_non_const() + size()); }
680  const_iterator cbegin() const { return const_iterator(data()); }
681  const_iterator cend() const { return const_iterator(data() + size()); }
682  };
683 
690  template<typename T>
691  const series<T>& series<T>::name(const std::string& name)const {
692  m_auto_series_name = name;
693  return *this;
694  }
695 
702  template<typename T> std::ostream& operator<<(std::ostream& s, series<T>& ser) {
703  s << ser[0];
704  return s;
705  }
706 
707  template<> type_t series<double>::value_type(void) const;
708  template<> type_t series<int>::value_type(void) const;
709  template<> type_t series<unsigned>::value_type(void) const;
710  template<> type_t series<float>::value_type(void) const;
711  template<> type_t series<bool>::value_type(void) const;
712  template<> type_t series<int64_t>::value_type(void) const;
713  template<> type_t series<uint64_t>::value_type(void) const;
714  template<> type_t series<string>::value_type(void) const;
715  template<> type_t series<std::string>::value_type(void) const;
716  template<> type_t series<date>::value_type(void) const;
717  template<> type_t series<date_time>::value_type(void) const;
718 
719  template<typename T> size_t series<T>::m_default_capacity = 3000;
720 
721  template<typename T>
722  series<T>::series(functor::functor_parent_base* ftor_ptr, bool called_by_series_ref_constr)
723  : m_core(value_type()), m_shift(0),
724  m_is_owner(true), m_series_imp_ptr(nullptr) {
725  set_owning_functor_ptr(ftor_ptr);
726  // When series are declare as strategy class members the strategy_state
727  // is 'undefined' (as there is no 'context'). When series are created
728  // automatically, the strategy state is 'initializing', and when they are
729  // created inside event-handlers, the strategy state is 'running'.
730  // Automatically created series are 'managed' whereas user declared ones
731  // are always 'unmanaged'.
732  strategy_state_type ss = strategy_context::state();
736  m_series_imp_ptr = new series_imp<T>();
737  m_series_imp_ptr->init_with_capacity(
738  m_default_capacity); //default capacity
739  tsa_assert(m_series_imp_ptr);
740  tsa_assert(!is_managed());
741  }
742  }
743 
744  template<typename T>
745  series<T>::series(const series<T>& other) :
746  m_core(other.m_core),
747  m_series_imp_ptr(nullptr),
748  m_shift(0) {
749  if (other.is_managed()) {
750  tsa_assert(m_core.is_init());
751  if (strategy_context::state() != strategy_state_type::preparing_managed_code) {
752  throw exception(class_name(), "Series<T> assignment operator can only be used as part of strategy::on_prepare().", SLOC);
753  }
754  }
755  else {
756  if (strategy_context::state() != strategy_state_type::preparing_managed_code) {
757  throw exception(class_name(),
758  "Do not use series copy constructor for 'unmanaged' series. "
759  "Use copy member function instead for deep copy.", SLOC);
760  }
761  m_series_imp_ptr = other.m_series_imp_ptr;
762  m_is_owner = false;
763  }
764  }
765 
766  template<typename T>
767  void series<T>::operator=(const series<T>& other) {
768  auto strat_state = strategy_context::state();
769  if (strat_state != strategy_state_type::preparing_managed_code) {
770  throw tsa::exception(class_name(), "series<T>::operator=() can only be used as part"
771  " of strategy::on_prepare()", SLOC);
772  }else{
773  if (m_was_assigned_in_DSP){
774  throw tsa::exception("series<T>::operator=()",
775  "Cannot assign a value to same series<T> object twice in the definition of strategy::on_prepare() (DSL)", SLOC);
776  }
777  m_was_assigned_in_DSP = true;
778  }
779  if (is_managed()) {
780  m_core.reset();
781  m_core.copy_members(other.m_core);
782  }
783  else {
784  tsa_assert(!is_managed());
785  tsa_assert(!m_core.is_init());
786  tsa_assert(m_series_imp_ptr);
787 
788  if (m_is_owner) {
789  delete m_series_imp_ptr;
790  m_is_owner = false;
791  m_series_imp_ptr = other.m_series_imp_ptr;
792  tsa_assert(m_series_imp_ptr);
793  m_functor_ptr = other.m_functor_ptr;
794  tsa_assert(m_series_imp_ptr != nullptr);
795  tsa_assert(!m_is_owner);
796  }
797  else {
798  tsa_assert(!m_is_owner);
799  m_series_imp_ptr = other.m_series_imp_ptr;
800  tsa_assert(m_series_imp_ptr);
801  m_functor_ptr = other.m_functor_ptr;
802  tsa_assert(m_series_imp_ptr != nullptr);
803  tsa_assert(!m_is_owner);
804  }
805  m_auto_series_name = other.m_auto_series_name;
806  copy_pane_format(other);
807  plot_info(other.plot_info());
808  }
809  }
810 
811  template<typename T>
813  : m_core(value_type()), m_shift(0),
814  m_is_owner(true) {
815  tsa_assert(strategy_context::state() == strategy_state_type::running
816  || strategy_context::state() == strategy_state_type::undefined);
817  m_series_imp_ptr = new series_imp<T>();
818  m_series_imp_ptr->reserve(capacity);
819  m_is_owner = true;
820  tsa_assert(m_series_imp_ptr);
821  tsa_assert(!is_managed());
822  }
823 
824  template<typename T>
825  series<T>::series(const series<T>& _ser, size_t _shift) :
826  m_core(_ser.m_core), m_series_imp_ptr(nullptr),
827  m_is_owner(false) {
828  tsa_assert(strategy_context::state() == strategy_state_type::running);
829  if (_ser.m_shift != 0)
830  {
831  throw exception(class_name(), "cannot 'shift' a series that is itself 'shifted'", SLOC);
832  }
833  if (!_ser.is_managed()) {
834  m_series_imp_ptr = _ser.m_series_imp_ptr;
835  m_is_owner = false;
836  }
837  m_shift = _shift + _ser.m_shift;
838  }
839 
840  template<typename T>
841  void series<T>::reserve(size_t _capacity) {
842  if (m_core.is_init()) {
843  throw exception(class_name(), "capacity is managed internally for 'managed' series", SLOC);
844  }
845  if (!m_series_imp_ptr) {
846  throw exception(class_name(), "series has not been initialized - capacity not yet set", SLOC);
847  }
848  tsa_assert(!is_managed());
849  tsa_assert(m_series_imp_ptr);
850  if (m_shift != 0) {
851  throw exception(class_name(), "cannot reset capacity on a 'shifted' series", SLOC);
852  }
853  m_series_imp_ptr->reserve(_capacity);
854  tsa_assert(m_series_imp_ptr->capacity() >= _capacity);
855  }
856 
857  template<typename T>
858  size_t series<T>::capacity(void) const {
859  if (m_core.is_init())
860  {
861  throw exception(class_name(), "capacity is managed internally for 'managed' series", SLOC);
862  }
863  if (!m_series_imp_ptr)
864  {
865  throw exception(class_name(), "series has not been initialized - capacity not yet set", SLOC);
866  }
867  if (m_shift != 0)
868  {
869  throw exception(class_name(), "cannot get capacity from a 'shifted' series", SLOC);
870  }
871  return m_series_imp_ptr->capacity();
872  }
873 
874  template<typename T>
875  void series<T>::copy(const series<T>& _other, size_t _max_num_values) {
876  size_t sz = _other.size();
877  m_series_imp_ptr->copy(*_other.m_series_imp_ptr, _max_num_values);
878  tsa_assert(size() == _other.size());
879  }
880 
881  template<typename T>
882  bool series<T>::is_equal(const series<T>& _other) const {
883  size_t sz = size();
884  if (sz != _other.size())
885  {
886  return false;
887  }
888  const T* data_a = _other.data();
889  const T* data_b = data();
890  return std::equal(data_a, data_a + sz, data_b);
891  //return ::memcmp((const void*)data_a, (const void*)data_b, size() * sizeof(T)) == 0;
892  }
893 
894  //This is for exclusive use in the strategy::on_prepare
895  template<typename T>
897  if (strategy_context::state() != strategy_state_type::preparing_managed_code)
898  throw tsa::exception(class_name(), "series<T>::operator=() can only be used as part"
899  " of strategy::on_prepare()", SLOC);
900  if (is_managed()) {
901  m_core.reset();
902  m_core.copy_members(other.series_ptr()->m_core);
903  }
904  else {
905  tsa_assert(!is_managed());
906  tsa_assert(!m_core.is_init());
907  tsa_assert(m_series_imp_ptr);
908 
909  if (m_is_owner) {
910  delete m_series_imp_ptr;
911  m_is_owner = false;
912  m_series_imp_ptr = other.series_ptr()->m_series_imp_ptr;
913  tsa_assert(m_series_imp_ptr);
914  m_functor_ptr = other.series_ptr()->m_functor_ptr;
915  tsa_assert(m_series_imp_ptr != nullptr);
916  tsa_assert(!m_is_owner);
917  }
918  else {
919  tsa_assert(!m_is_owner);
920  m_series_imp_ptr = other.series_ptr()->m_series_imp_ptr;
921  tsa_assert(m_series_imp_ptr);
922  m_functor_ptr = other.series_ptr()->m_functor_ptr;
923  tsa_assert(m_series_imp_ptr != nullptr);
924  tsa_assert(!m_is_owner);
925  }
926  }
927  }
928 
929  template<typename T>
930  void series<T>::raise_type_mismatch(void) {
931  throw tsa::exception(class_name(),
932  "series type mismatch - check series-type matches parameter type", SLOC);
933  }
934 
935  template<typename T>
936  series<T>::series(const series_core& core) :
937  m_core(core),
938  m_series_imp_ptr(nullptr),
939  m_shift(0),
940  m_is_owner(false) {
941  if (!core.is_init())
942  {
943  throw exception(class_name(), "series constructor argument is not initialized", SLOC);
944  }
945  if (value_type() != core.type())
946  {
947  raise_type_mismatch();
948  }
949  }
950 
951  template<typename T>
952  void series<T>::init_as_auto_series(const series_core& core,
953  const std::string& field_name)
954  {
955  if (m_series_imp_ptr){
956  delete m_series_imp_ptr;
957  m_series_imp_ptr = nullptr;
958  }
959  if (!is_numeric(core.type()))
960  {
961  return;
962  }
963 
964  if (!core.is_init()) {
965  //Note: Move initialization away from here
966  ((series_core&)core).Init();
967  ((series_core&)core).SetSource(field_name);
968  }
969  tsa_assert(core.is_init());
970  if (core.name() != field_name) {
971  throw exception(class_name(),
972  "field name mismatch: " + core.name() + " vs " + field_name, SLOC);
973  }
974  m_is_nonexistant_auto_series = false;
975  m_core.copy_members(core);
976  m_shift = 0;
977  m_is_owner = false;
978 
979  if (value_type() != core.type()) {
980  raise_type_mismatch();
981  }
982  tsa_assert(is_managed());
983  }
984 
985  template<typename T>
987  if (m_series_imp_ptr) {
988  if (m_is_owner) {
989  delete m_series_imp_ptr;
990  }
991  }
992  }
993 
994  template<typename T>
995  bool series<T>::is_managed(void) const {
996  return !m_series_imp_ptr;
997  }
998 
999  template<typename T>
1000  void series<T>::clear(void) {
1001  if (!m_series_imp_ptr)
1002  {
1003  throw exception(class_name(), "can only 'clear' unmanaged series", SLOC);
1004  }
1005  m_series_imp_ptr->clear();
1006  tsa_assert(m_series_imp_ptr->size() == 0);
1007  }
1008 
1009  template<typename T>
1011  if (!m_series_imp_ptr) {
1012  throw exception(class_name(), "cannot 'fill' managed series", SLOC);
1013  }
1014  else {
1015  if (m_shift != 0)
1016  {
1017  throw exception(class_name(), "cannot 'fill' a 'shifted' series", SLOC);
1018  }
1019  m_series_imp_ptr->fill(_value);
1020  }
1021  }
1022 
1023  template<typename T>
1024  void series<T>::set_size(size_t _new_size) {
1025  if (!m_series_imp_ptr) {
1026  throw exception(class_name(), "cannot 'set_size' managed series",
1027  SLOC);
1028  }
1029  else {
1030  if (m_shift != 0)
1031  {
1032  throw exception(class_name(), "cannot 'reset_size' of a 'shifted' series", SLOC);
1033  }
1034  m_series_imp_ptr->reset_size(_new_size);
1035  }
1036  }
1037 
1038  template<typename T>
1039  void series<T>::push(T _v) {
1040  if (m_shift != 0)
1041  {
1042  throw exception(class_name(), "cannot push values on a 'shifted' series", SLOC);
1043  }
1044  if (m_series_imp_ptr && m_is_owner) {
1045  m_series_imp_ptr->push(_v);
1046  }
1047  else {
1048  throw exception(class_name(), "cannot push values onto a 'managed' series", SLOC);
1049  }
1050  }
1051 
1052  template<typename T>
1053  void series<T>::_internal_push(T _v) {
1054  if (m_shift != 0)
1055  {
1056  throw exception(class_name(), "functionality not available for 'unmanaged' series", SLOC);
1057  }
1058  if (m_series_imp_ptr) {
1059  throw exception(class_name(), "cannot push values on a 'shifted' series", SLOC);
1060  }
1061  else {
1062  m_core.push_front(_v);
1063  }
1064  }
1065 
1066  template<typename T>
1067  void series<T>::push(const variant& _v) {
1068  if (m_series_imp_ptr) {
1069  m_series_imp_ptr->push(_v);
1070  }
1071  else {
1072  throw exception(class_name(), "cannot add values to an 'auto-series'", SLOC);
1073  }
1074  }
1075 
1076  template<typename T>
1077  T series<T>::get_at(size_t _idx) const {
1078  if (m_series_imp_ptr) {
1079  tsa_assert(m_shift == 0);
1080  return m_series_imp_ptr->at(_idx);
1081  }
1082  else {
1083  return m_core.at(_idx + m_shift).get<T>();
1084  }
1085  }
1086 
1087  template<typename T>
1088  T series<T>::get_at_no_exc(size_t _idx) const {
1089  if (m_series_imp_ptr) {
1090  throw exception(class_name(), "not implemented", SLOC);
1091  }
1092  else {
1093  return (T)m_core.at__noexcept(_idx + m_shift);
1094  }
1095  }
1096 
1097  template<typename T>
1098  const T* series<T>::data(void) const {
1099  if (m_series_imp_ptr) {
1100  tsa_assert(m_series_imp_ptr->size() >= m_shift);
1101  return ((T*)m_series_imp_ptr->data__as_void_ptr()) + m_shift;
1102  }
1103  else {
1104  return (T*)m_core.data() + m_shift;
1105  }
1106  }
1107 
1108  template<typename T>
1109  T* series<T>::data_non_const(void) {
1110  if (m_series_imp_ptr) {
1111  if (m_shift != 0)
1112  {
1113  throw exception(class_name(), "Cannot return non-const data pointer from 'shifted' series", SLOC);
1114  }
1115  return (T*)m_series_imp_ptr->data__as_void_ptr();
1116  }
1117  else {
1118  return (T*)m_core.data() + m_shift;
1119  }
1120  }
1121 
1122  template<typename T>
1123  T series<T>::operator[](size_t _idx) const {
1124  if (m_series_imp_ptr) {
1125  if (m_is_nonexistant_auto_series) {
1126  throw exception(class_name(), "Series not intitialized. Check if data-source has this field: "
1127  + m_auto_series_name, SLOC);
1128  }
1129  return m_series_imp_ptr->at(_idx + m_shift);
1130  }
1131  else {
1132  const variant& v = m_core.at(_idx + m_shift);
1133  return v.get<T>();
1134  }
1135  }
1136 
1137  template<typename T>
1138  size_t series<T>::size(void) const {
1139  if (m_series_imp_ptr) {
1140  tsa_assert(m_series_imp_ptr->size() >= m_shift);
1141  return m_series_imp_ptr->size() - m_shift;
1142  }
1143  else {
1144  size_t core_sz = m_core.Size();
1145  if (core_sz < m_shift)
1146  {
1147  return 0;
1148  }
1149  else { return core_sz - m_shift; }
1150  }
1151  }
1152 
1153  template<typename T>
1154  const series<T> series<T>::shift(size_t _shift_by) const {
1155  verify_size(_shift_by + 1);
1156  tsa_assert(size() >= _shift_by);
1157  return series<T>(*this, _shift_by);
1158  }
1159 
1160  template<typename T>
1161  void series<T>::verify_size(size_t _required_size) const {
1162  if (_required_size == 0)
1163  throw tsa::exception("invalide size argument to verify_size: 0", SLOC);
1164  if (m_series_imp_ptr) {
1165  if (m_series_imp_ptr->size() < _required_size) {
1166  if (capacity() < _required_size) {
1167  //Note: move this functionality to series_imp
1168  ((series<T>*)this)->reserve(_required_size);
1169  tsa_assert(capacity() == _required_size);
1170  }
1171  throw tsa::series_bounds_error("unmanaged-series: insufficient data in series", 0, 0);
1172  }
1173  }
1174  else {
1175  m_core.verify_size(_required_size + m_shift);
1176  }
1177  }
1178 
1179  template<typename T>
1180  bool series<T>::size_ok(size_t _required_size) const {
1181  if (m_series_imp_ptr) {
1182  if (m_series_imp_ptr->size() < _required_size) {
1183  if (capacity() < _required_size) {
1184  //Note: move this functionality to series_imp
1185  ((series<T>*)this)->reserve(_required_size);
1186  tsa_assert(capacity() == _required_size);
1187  }
1188  return false;
1189  }
1190  return true;
1191  }
1192  else {
1193  return m_core.size_ok(_required_size + m_shift);
1194  }
1195  }
1196 
1197  template<typename T>
1198  void series<T>::CopyTo(std::vector<T>& _vec,
1199  size_t _size) {
1200  verify_size(_size);
1201  _vec.clear();
1202  _vec.resize(_size);
1203  for (size_t c = 0; c < _size; c++) {
1204  _vec[c] = get_at(c);
1205  }
1206  tsa_assert(_vec.size() == _size);
1207  }
1208 
1209  template<typename T>
1210  void series<T>::print(std::ostream& _s, size_t _max) {
1211  if (size() == 0) { _s << "[]"; return; }
1212  _s << "[";
1213  for (size_t c = 0; c < _max; c++) {
1214  if (c < size() && c < _max) {
1215  _s << get_at(c);
1216  if (c != (size() - 1) && c != (_max - 1))
1217  {
1218  _s << ",";
1219  }
1220  else { _s << "]"; }
1221  }
1222  }
1223  }
1224 
1225  template<typename T>
1226  void series<T>::print_v(std::ostream& _s, size_t _max) {
1227  if (size() == 0) { return; }
1228  for (size_t c = 0; c < _max; c++) {
1229  if (c < size() && c < _max) {
1230  _s << "[" << c << "]:" << get_at(c) << std::endl;
1231  }
1232  }
1233  }
1234 
1235  template<typename T>
1237  throw tsa::exception("series<T>",
1238  "data type not supported by template", SLOC);
1239  }
1240 
1241  template<typename T>
1243  const {
1244  return get_at(0) > _other.get_at(0)
1245  && get_at(1) <= _other.get_at(1);
1246  }
1247 
1248  template<typename T>
1250  const {
1251  return get_at(0) < _other.get_at(0)
1252  && get_at(1) >= _other.get_at(1);
1253  }
1254 
1255  template<typename T>
1256  bool series<T>::crosses_above(double _threshold) const {
1257  return get_at(0) > _threshold
1258  && get_at(1) <= _threshold;
1259  }
1260 
1261  template<typename T>
1262  bool series<T>::crosses_below(double _threshold) const {
1263  return get_at(0) < _threshold
1264  && get_at(1) >= _threshold;
1265  }
1266 
1267  /*
1268  ** ====================================================
1269  ** >>> class series_cref <<<
1270  ** ====================================================
1271  */
1272 
1277  template<typename T = double>
1278  class series_cref : public tsa::object {
1279  protected:
1280  const series<T>* m_series_ptr = nullptr;
1281  public:
1283  series_cref(void) : m_series_ptr(nullptr) { ; }
1285  series_cref(const series<T>& other) {
1286  m_series_ptr = &other;
1287  }
1289  series_cref(const series_cref<T>& other) {
1290  if (other.m_series_ptr == nullptr) {
1291  throw tsa::exception(class_name(), "series_ref not initialized", SLOC);
1292  }
1293  m_series_ptr = other.m_series_ptr;
1294  }
1296  void operator=(const series_cref<T>& other) {
1297  strategy* strat_ptr = strategy_context::strategy_ptr();
1298  if (strat_ptr->state() != strategy_state_type::preparing_managed_code)
1299  throw tsa::exception(class_name(), "series<T>::operator=() can only be used as part"
1300  " of strategy::on_prepare()", SLOC);
1301  m_series_ptr = other.m_series_ptr;
1302  }
1304  virtual ~series_cref(void) { ; }
1306  void operator=(const series<T>&) = delete;
1308  type_t type(void)const { return m_series_ptr->type(); }
1310  void push(T) = delete;
1312  void push(const variant&) = delete;
1314  operator const series<T>& (void) { tsa_assert(m_series_ptr); return *m_series_ptr; }
1316  T operator[](size_t pos)const {
1317  tsa_assert(m_series_ptr != nullptr);
1318  return m_series_ptr->operator[](pos);
1319  }
1322  return SHIFT(*this, shift_by);
1323  }
1325  const T* data(void)const {
1326  tsa_assert(m_series_ptr != nullptr);
1327  return m_series_ptr->data();
1328  }
1330  void verify_size(size_t sz)const {
1331  tsa_assert(m_series_ptr != nullptr);
1332  return m_series_ptr->verify_size(sz);
1333  }
1335  bool size_ok(size_t sz)const {
1336  tsa_assert(m_series_ptr != nullptr);
1337  return m_series_ptr->size_ok(sz);
1338  }
1340  size_t size(void)const {
1341  tsa_assert(m_series_ptr != nullptr);
1342  return m_series_ptr->size();
1343  }
1344  public:
1346  const series<T>* series_ptr(void)const { return m_series_ptr; }
1347  public:
1349  void pane_h_line(const h_line& hl) { m_series_ptr->m_h_lines.push_back(hl); }
1351  void pane_h_line(const tsa::color& c, double y_value, int weight = 1) {
1352  m_series_ptr->m_h_lines.push_back(tsa::h_line(c, y_value, weight));
1353  }
1355  void pane_y_max(double max) { m_series_ptr->m_pane_y_max = max; }
1357  void pane_y_min(double min) { m_series_ptr->m_pane_y_min = min; }
1359  void pane_show_grid(bool b) { m_series_ptr->m_show_grid = b; }
1361  void pane_dotted_grid(bool b) { m_series_ptr->m_dotted_grid = b; }
1363  void pane_grid_color(const tsa::color& c) { m_series_ptr->m_grid_color = c; }
1365  void pane_auto_pane(bool b) { m_series_ptr->m_auto_pane = b; }
1367  const std::vector<tsa::h_line>& pane_h_lines(void)const { return m_series_ptr->m_h_lines; }
1369  const variant& pane_y_max(void)const { return m_series_ptr->m_pane_y_max; }
1371  const variant& pane_y_min(void)const { return m_series_ptr->m_pane_y_min; }
1372  public:
1374  const series_cref<T>& name(const std::string& name)const {
1375  m_series_ptr->name(name);
1376  return *this;
1377  }
1379  std::string name(void)const { return m_series_ptr->name(); }
1382  m_series_ptr->plot_info(pi);
1383  return *this;
1384  }
1386  const series_cref<T>& plot_as(const std::string& name, const tsa::variant& period = 0.0,
1387  plot_type type = plot_type::line, tsa::color clr = tsa::color::auto_color, unsigned weight = 2)const {
1388  plot_info pi;
1389  pi.name = name;
1390  pi.period(period);
1391  pi.type = type;
1392  pi.clr = clr;
1393  pi.weight = weight;
1394  m_series_ptr->plot_info(pi);
1395  return *this;
1396  }
1398  const series_cref<T>& plot_as(const std::string& name, const std::vector<tsa::variant>& periods,
1399  plot_type type = plot_type::line, tsa::color clr = tsa::color::auto_color, unsigned weight = 2)const {
1400  plot_info pi;
1401  pi.name = name;
1402  std::vector<tsa::variant> adj_periods = periods;
1403  adj_periods.resize(4, variant());
1404  tsa_assert(adj_periods.size() == 4);
1405 
1406  pi.period(adj_periods[0], adj_periods[1], adj_periods[2], adj_periods[3]);
1407  pi.type = type;
1408  pi.clr = clr;
1409  pi.weight = weight;
1410  m_series_ptr->plot_info(pi);
1411  return *this;
1412  }
1413  };
1414 
1415  template<typename T>
1416  using series_ref = series_cref < T > ; //alias
1417 
1418  template<typename T>
1419  using sref = series_cref < T >; //alias
1420 
1421  /*
1422  ** ====================================================
1423  ** >>> class series_tuple <<<
1424  ** ====================================================
1425  */
1426 
1431  template<typename T = double>
1432  class series_tuple : public tsa::object, public pane_format {
1433  std::vector<series_cref<T>> m_series_refs;
1434  public:
1436  series_tuple(void) { ; }
1439  m_series_refs = { ser };
1440  }
1443  m_series_refs = { a, b };
1444  }
1447  m_series_refs = { a, b, c };
1448  }
1450  void add(const series_cref<T>& ser){
1451  m_series_refs.push_back(ser);
1452  }
1454  size_t size(void)const { return m_series_refs.size(); }
1456  const series<T>& operator[](size_t pos)const {
1457  return *(m_series_refs[pos].series_ptr());
1458  }
1459 
1460  const series<T>& operator[](const std::string& name)const {
1461  return operator[](position(name));
1462  }
1463 
1465  size_t position(const std::string& name)const {
1466  size_t position=0; bool found = false;
1467  for(const auto& ref : m_series_refs){
1468  if (ref.series_ptr()->name() == name){
1469  found = true; break;
1470  }else position++;
1471  }
1472  if (!found)
1473  throw tsa::exception("series_tuple","no items with name: " + name,SLOC);
1474  return position;
1475  }
1476 
1478  series_cref<T> operator()(size_t position) {
1479  return m_series_refs[position];
1480  }
1483  for (size_t c(0); c < m_series_refs.size();c++){
1484  if (m_series_refs[c].series_ptr()->name() == name)
1485  {
1486  return m_series_refs[c];
1487  }
1488  }
1489  /* for (auto& s : m_series_refs) {
1490  if (s.series_ptr()->name() == name)
1491  {
1492  return s;
1493  }
1494  }*/
1495  throw tsa::exception(class_name(), "No item with found with given name: " + name, SLOC);
1496  }
1497  };
1498 
1499 
1500  /*
1501  ** ====================================================
1502  ** >>> class numeric_series_cref <<<
1503  ** ====================================================
1504  */
1505 
1510  const series_template_base* m_series_ptr = nullptr;
1511  public:
1513  numeric_series_cref(void) = delete;
1516  m_series_ptr = other.m_series_ptr;
1517  }
1519  numeric_series_cref(double num);
1521  numeric_series_cref(int num);
1523  numeric_series_cref(int64_t num);
1525  numeric_series_cref(uint64_t num);
1526  public:
1529  m_series_ptr = (const series_template_base*)(&other);
1530  }
1533  m_series_ptr = (const series_template_base*)(&other);
1534  }
1537  m_series_ptr = (const series_template_base*)(&other);
1538  }
1541  m_series_ptr = (const series_template_base*)(&other);
1542  }
1545  m_series_ptr = (const series_template_base*)(&other);
1546  }
1549  m_series_ptr = (const series_template_base*)(&other);
1550  }
1551 
1552  public:
1555  m_series_ptr = (const series_template_base*)(other.series_ptr());
1556  }
1559  m_series_ptr = (const series_template_base*)(other.series_ptr());
1560  }
1563  m_series_ptr = (const series_template_base*)(other.series_ptr());
1564  }
1567  m_series_ptr = (const series_template_base*)(other.series_ptr());
1568  }
1571  m_series_ptr = (const series_template_base*)(other.series_ptr());
1572  }
1575  m_series_ptr = (const series_template_base*)(other.series_ptr());
1576  }
1577  public:
1579  //numeric_series_cref(const scalar_assigner<double>& other) {
1580  // m_series_ptr = (const series_template_base*)(sref<double>(other).series_ptr());
1581  //}
1583  //numeric_series_cref(const scalar_assigner<int>& assigner) {
1584  // sref<int> ser = assigner;
1585  // m_series_ptr = (const series_template_base*)(ser.series_ptr());
1586  //}
1587  public:
1589  const series_template_base* get(void)const {
1590  return m_series_ptr;
1591  }
1593  bool size_ok(size_t sz)const {
1594  tsa_assert(m_series_ptr != nullptr);
1595  return m_series_ptr->size_ok(sz);
1596  }
1597  };
1598 
1599  /*
1600  ** ====================================================
1601  ** >>> class auto_cast_bool_cref <<<
1602  ** ====================================================
1603  */
1604 
1609  const series_template_base* m_series_ptr = nullptr;
1610  public:
1611  /* template<typename T>
1612  auto_cast_bool_series_cref(T v) {
1613  m_series_ptr = (const series_template_base*)CONST<T>(v).series_ptr();
1614  }*/
1616  auto_cast_bool_series_cref(void) = delete;
1617 
1619  auto_cast_bool_series_cref(bool value);
1620 
1622  template<typename T>
1624  m_series_ptr = (const series_template_base*)(&other);
1625  }
1627  template<typename T>
1629  if (other.series_ptr() == nullptr) {
1630  throw tsa::exception(class_name(), "series_ref not initialized", SLOC);
1631  }
1632  m_series_ptr = (const series_template_base*)other.series_ptr();
1633  }
1634 
1636  //template<typename T>
1637  //auto_cast_bool_series_cref(const scalar<T>& other) {
1638  // m_series_ptr = (const series_template_base*)(other.series_ptr());
1639  //}
1640 
1642  const series_template_base* get(void)const { return m_series_ptr; }
1644  bool operator[](size_t pos)const {
1645  return m_series_ptr->at(pos).to_bool();
1646  }
1648  bool size_ok(size_t sz)const {
1649  tsa_assert(m_series_ptr != nullptr);
1650  return m_series_ptr->size_ok(sz);
1651  }
1652  };
1653 
1654  /*
1655  ** ====================================================
1656  ** >>> class bool_series_cref <<<
1657  ** ====================================================
1658  */
1659 
1664  const series_template_base* m_series_ptr = nullptr;
1665  public:
1667  bool_series_cref(void) = delete;
1670  m_series_ptr = other.m_series_ptr;
1671  }
1674  m_series_ptr = other.get();
1675  }
1678  m_series_ptr = (const series_template_base*)(&other);
1679  }
1681  const series_template_base* get(void)const { return m_series_ptr; }
1683  bool operator[](size_t pos)const {
1684  return (bool)m_series_ptr->at(pos);
1685  }
1687  bool size_ok(size_t sz)const {
1688  tsa_assert(m_series_ptr != nullptr);
1689  return m_series_ptr->size_ok(sz);
1690  }
1691  };
1692 
1693  /*
1694  ** ====================================================
1695  ** >>> class string_series_cref <<<
1696  ** ====================================================
1697  */
1698 
1703  const series_template_base* m_series_ptr = nullptr;
1704  public:
1706  string_series_cref(void) = delete;
1709  m_series_ptr = other.m_series_ptr;
1710  }
1713  m_series_ptr = (const series_template_base*)(&other);
1714  }
1716  const series_template_base* get(void)const { return m_series_ptr; }
1718  std::string operator[](size_t pos)const {
1719  return m_series_ptr->at(pos).to_string();
1720  }
1722  bool size_ok(size_t sz)const {
1723  tsa_assert(m_series_ptr != nullptr);
1724  return m_series_ptr->size_ok(sz);
1725  }
1726  };
1727 
1728  /*
1729  ** ====================================================
1730  ** >>> class date_series_cref <<<
1731  ** ====================================================
1732  */
1733 
1738  const series_template_base* m_series_ptr = nullptr;
1739  public:
1741  date_series_cref(void) = delete;
1744  m_series_ptr = other.m_series_ptr;
1745  }
1748  m_series_ptr = (const series_template_base*)(&other);
1749  }
1751  const series_template_base* get(void)const { return m_series_ptr; }
1753  tsa::date operator[](size_t pos)const {
1754  return m_series_ptr->at(pos).to_date();
1755  }
1757  bool size_ok(size_t sz)const {
1758  tsa_assert(m_series_ptr != nullptr);
1759  return m_series_ptr->size_ok(sz);
1760  }
1761  };
1762 
1763  /*
1764  ** ====================================================
1765  ** >>> class date_series_cref <<<
1766  ** ====================================================
1767  */
1768 
1773  const series_template_base* m_series_ptr = nullptr;
1774  public:
1776  datetime_series_cref(void) = delete;
1779  m_series_ptr = other.m_series_ptr;
1780  }
1783  m_series_ptr = (const series_template_base*)(&other);
1784  }
1786  const series_template_base* get(void)const { return m_series_ptr; }
1788  tsa::date_time operator[](size_t pos)const {
1789  return m_series_ptr->at(pos).to_datetime();
1790  }
1792  bool size_ok(size_t sz)const {
1793  tsa_assert(m_series_ptr != nullptr);
1794  return m_series_ptr->size_ok(sz);
1795  }
1796  };
1797 
1798  /*
1799  ** ====================================================
1800  ** >>> class any_series_cref <<<
1801  ** ====================================================
1802  */
1803 
1808  const series_template_base* m_series_ptr = nullptr;
1809  public:
1811  any_series_cref(void) = delete;
1814  m_series_ptr = other.m_series_ptr;
1815  }
1817  explicit any_series_cref(const series_template_base* other_ptr) {
1818  m_series_ptr = other_ptr;
1819  }
1821  template<typename T>
1822  any_series_cref(const series<T>& other) {
1823  m_series_ptr = (const series_template_base*)(&other);
1824  }
1826  //template<typename T>
1827  //any_series_cref(const scalar<T>& other) {
1828  // m_series_ptr = (const series_template_base*)(other.series_ptr());
1829  //}
1831  const series_template_base* get_ptr(void)const { return m_series_ptr; }
1832 
1834  template<typename T> any_series_cref(const series_cref<T>& other) {
1835  if (other.series_ptr() == nullptr) {
1836  throw tsa::exception(class_name(), "series_ref not initialized", SLOC);
1837  }
1838  m_series_ptr = (const series_template_base*)other.series_ptr();
1839  }
1841  variant operator[](size_t pos) {
1842  return variant(m_series_ptr->at(pos));
1843  }
1845  bool size_ok(size_t sz) {
1846  tsa_assert(m_series_ptr != nullptr);
1847  return m_series_ptr->size_ok(sz);
1848  }
1850  bool is_numeric(void)const {
1851  throw tsa::exception(class_name(), "is_numeric() member not implemented", SLOC);
1852  return true;
1853  }
1854  };
1855 
1856  /*
1857  ** ====================================================
1858  ** >>> class CONTAINER <<<
1859  ** ====================================================
1860  */
1861 
1865  class container : public tsa::object {
1866  std::vector<any_series_cref> m_series_refs;
1867  public:
1869  container(void) { ; }
1871  container(const container& other) {
1872  m_series_refs = other.m_series_refs;
1873  }
1876  m_series_refs = { ser };
1877  }
1880  m_series_refs = { a, b };
1881  }
1884  m_series_refs = { a, b, c };
1885  }
1888  m_series_refs = { a, b, c, d };
1889  }
1891  size_t element_count(void)const { return m_series_refs.size(); }
1893  bool size_ok(size_t sz) {
1894  bool sz_ok = true;
1895  for (auto& r : m_series_refs) {
1896  sz_ok &= r.size_ok(sz);
1897  }
1898  return sz_ok;
1899  }
1901  size_t size(void)const { return m_series_refs.size(); }
1903  bool all_numeric(void) {
1904  bool numeric = true;
1905  for (auto& s : m_series_refs) {
1906  numeric &= s.is_numeric();
1907  }
1908  return numeric;
1909  }
1911  const any_series_cref& operator[](size_t pos)const {
1912  return m_series_refs[pos];
1913  }
1915  void push(any_series_cref new_item) {
1916  m_series_refs.push_back(new_item);
1917  }
1919  void fetch_variants(std::vector<variant>& arr) {
1920  size_t sz = m_series_refs.size();
1921  if (arr.size() != sz) {
1922  arr.resize(sz);
1923  }
1924  for (size_t c = 0; c < sz; c++) {
1925  arr[c] = m_series_refs[c][0];
1926  }
1927  }
1928  };
1929 
1930 
1931 
1933 } //tsa
1934 
1935 #endif
size_t element_count(void) const
Definition: TSASeriesTemplate.h:1891
void push(T)
Adds a new value to the front of the series. The new item will be accessible at position 0...
Definition: TSASeriesTemplate.h:1039
auto_cast_bool_series_cref(const series< T > &other)
Definition: TSASeriesTemplate.h:1623
A datetime series cref.
Definition: TSASeriesTemplate.h:1772
void period(const tsa::variant &period0, const tsa::variant &period1=variant(), const tsa::variant &period2=variant(), const tsa::variant &period3=variant())
... (-1) for dynamic
Definition: TSASeriesTemplate.cpp:52
numeric_series_cref(const series< uint64_t > &other)
Definition: TSASeriesTemplate.h:1548
numeric_series_cref(const series_cref< int64_t > &other)
Definition: TSASeriesTemplate.h:1570
bool_series_cref(const bool_series_cref &other)
Definition: TSASeriesTemplate.h:1669
T operator[](size_t position) const
Returns the value at given position.
Definition: TSASeriesTemplate.h:1123
const series< T > shift_by(const series< T > &in_series, size_t shift_by)
Returns a series that is a &#39;shifted&#39; version of the given in_series argument. The returned series wil...
Definition: TSAFunctions.h:99
void fill_to_capacity(T value)
Clears the series and then fills it to capacity with given value.
Definition: TSASeriesTemplate.h:1010
void fetch_variants(std::vector< variant > &arr)
Definition: TSASeriesTemplate.h:1919
tsa::date operator[](size_t pos) const
Definition: TSASeriesTemplate.h:1753
bool size_ok(size_t sz) const
Definition: TSASeriesTemplate.h:1687
any_series_cref(const any_series_cref &other)
Definition: TSASeriesTemplate.h:1813
class series is a template class representing a sequence of values.
Definition: TSASeriesProxy.h:24
void verify_size(size_t sz) const
Definition: TSASeriesTemplate.h:1330
void pane_h_line(const h_line &hl) const
Definition: TSASeriesTemplate.h:181
Namespace for the &#39;Trading System API&#39; library.
Definition: original1.TSA3Core.cpp:20
datetime_series_cref(const datetime_series_cref &other)
Definition: TSASeriesTemplate.h:1778
T get(void) const
Returns the objects data. The object&#39;s type must match the template typename. If not, an exception is thrown.
static const color auto_color
Definition: TSATypeDef.h:1099
sref< double > operator*(numeric_series_cref a, numeric_series_cref b)
Multiplies a by b.
Definition: TSADSLBase.cpp:42
bool size_ok(size_t sz) const
Definition: TSASeriesTemplate.h:1593
void verify_non_zero(size_t value)
Definition: TSASeriesTemplate.cpp:29
container(void)
Definition: TSASeriesTemplate.h:1869
void pane_y_min(double min)
Definition: TSASeriesTemplate.h:1357
void push(any_series_cref new_item)
Definition: TSASeriesTemplate.h:1915
bool size_ok(size_t sz) const
Definition: TSASeriesTemplate.h:1757
container(any_series_cref a, any_series_cref b)
Definition: TSASeriesTemplate.h:1879
const any_series_cref & operator[](size_t pos) const
Definition: TSASeriesTemplate.h:1911
numeric_series_cref(const series< int > &other)
Definition: TSASeriesTemplate.h:1536
series_tuple(const series_cref< T > &ser)
Definition: TSASeriesTemplate.h:1438
virtual bool size_ok(size_t _required_size) const
Size ok.
Definition: TSASeriesTemplate.h:1180
string_series_cref(const series< std::string > &other)
Definition: TSASeriesTemplate.h:1712
container(any_series_cref ser)
Definition: TSASeriesTemplate.h:1875
date_series_cref(const date_series_cref &other)
Definition: TSASeriesTemplate.h:1743
any_series_cref(const series_cref< T > &other)
Definition: TSASeriesTemplate.h:1834
void copy(const series &other, size_t max_num_values=~(size_t) 0)
Copies num_values from the other series, starting at position 0. If num_values is 0...
Definition: TSASeriesTemplate.h:875
const series_template_base * get(void) const
Definition: TSASeriesTemplate.h:1642
bool size_ok(size_t sz)
Definition: TSASeriesTemplate.h:1845
container(any_series_cref a, any_series_cref b, any_series_cref c, any_series_cref d)
Definition: TSASeriesTemplate.h:1887
void pane_y_max(double max)
Definition: TSASeriesTemplate.h:1355
numeric_series_cref(const series< unsigned > &other)
Definition: TSASeriesTemplate.h:1540
T operator[](size_t pos) const
Definition: TSASeriesTemplate.h:1316
void pane_grid_color(const tsa::color &c) const
Definition: TSASeriesTemplate.h:197
series_cref< T > operator()(size_t shift_by) const
Definition: TSASeriesTemplate.h:1321
#define SLOC
Macro to be passed as argument to Exception constructors. Contains information about the source locat...
Definition: TSAError.h:92
const variant & pane_y_max(void) const
Definition: TSASeriesTemplate.h:1369
void pane_auto_pane(bool b)
Definition: TSASeriesTemplate.h:1365
numeric_series_cref(const numeric_series_cref &other)
Definition: TSASeriesTemplate.h:1515
A pane format.
Definition: TSASeriesTemplate.h:178
strategy_state_type
Values that represent strategy state ts.
Definition: TSATypeDef.h:84
void pane_h_line(const tsa::color &c, double y_value, int weight=1)
Definition: TSASeriesTemplate.h:1351
const tsa::plot_info & plot_info(void) const
Definition: TSASeriesTemplate.h:271
datetime_series_cref(const series< tsa::date_time > &other)
Definition: TSASeriesTemplate.h:1782
plot_type
Values that represent plot types.
Definition: TSASeriesTemplate.h:149
const std::vector< tsa::h_line > & pane_h_lines(void) const
Definition: TSASeriesTemplate.h:201
void reserve(size_t capacity)
Sets the serie&#39;s capacity to at least as high as the given capacity argument. It is not possible to s...
Definition: TSASeriesTemplate.h:841
void pane_show_grid(bool b) const
Definition: TSASeriesTemplate.h:193
void verify_size(size_t reqired_size) const
Compares the series size to required_size. If the series size is shorter then a lookback_exception is...
Definition: TSASeriesTemplate.h:1161
bool is_owner(void) const
Query if this object is owner.
Definition: TSASeriesTemplate.h:404
type_t type(void) const
Definition: TSASeriesTemplate.h:1308
void print(std::ostream &stream, size_t max=1000)
Prints the series to given stream. At most max items will be printed. The leftmost value printed corr...
Definition: TSASeriesTemplate.h:1210
const variant & pane_y_min(void) const
Definition: TSASeriesTemplate.h:1371
bool operator[](size_t pos) const
Definition: TSASeriesTemplate.h:1644
The series tuple.
Definition: TSASeriesTemplate.h:131
const series_cref< T > & plot_as(const std::string &name, const std::vector< tsa::variant > &periods, plot_type type=plot_type::line, tsa::color clr=tsa::color::auto_color, unsigned weight=2) const
Definition: TSASeriesTemplate.h:1398
A numeric series cref.
Definition: TSASeriesTemplate.h:1509
numeric_series_cref(const series_cref< unsigned > &other)
Definition: TSASeriesTemplate.h:1566
void pane_dotted_grid(bool b) const
Definition: TSASeriesTemplate.h:195
bool_series_cref(const auto_cast_bool_series_cref &other)
Definition: TSASeriesTemplate.h:1673
sref< T > SHIFT(const series< T > &series, size_t shift_by)
Shifts the series by shift_by positions. This is the equivalent of using series<T>::operator().
Definition: TSADSLBase.h:1130
variant operator[](size_t pos)
Definition: TSASeriesTemplate.h:1841
size_t size(void) const
Definition: TSASeriesTemplate.h:1340
bool all_numeric(void)
Definition: TSASeriesTemplate.h:1903
sref< bool > operator>(numeric_series_cref a, numeric_series_cref b)
comparison.
Definition: TSADSLBase.cpp:104
std::string operator[](size_t pos) const
Definition: TSASeriesTemplate.h:1718
std::string name(void) const
Definition: TSASeriesTemplate.h:1379
void pane_auto_pane(bool b) const
Definition: TSASeriesTemplate.h:199
const series< T > * series_ptr(void) const
Definition: TSASeriesTemplate.h:1346
void pane_grid_color(const tsa::color &c)
Definition: TSASeriesTemplate.h:1363
const T * data(void) const
Definition: TSASeriesTemplate.h:1325
_value_types_type type_t
Defines type_t as an alias of enum _value_types_type.
Definition: TSATypeDef.h:189
numeric_series_cref(const series< int64_t > &other)
Definition: TSASeriesTemplate.h:1544
static size_t default_capacity(void)
Definition: TSASeriesTemplate.h:256
variant objects can represent values of different types.
Definition: TSAVariant.h:140
series_cref(const series< T > &other)
Definition: TSASeriesTemplate.h:1285
void pane_h_line(const tsa::color &c, double y_value, int weight) const
Definition: TSASeriesTemplate.h:183
numeric_series_cref(const series< float > &other)
Definition: TSASeriesTemplate.h:1532
const char * class_name(void) const
Returns the class name as returned by the &#39;Real Time Type Information&#39; (RTTI) mechanism.
Definition: TSATypeDef.cpp:60
container(any_series_cref a, any_series_cref b, any_series_cref c)
Definition: TSASeriesTemplate.h:1883
_value_types_type
Data type enumeration used throughout the library. Intended to be used via type_t.
Definition: TSATypeDef.h:166
Class tsa::exception used by most classes of the Trading System API library. The class inherits from ...
Definition: TSAError.h:37
void plot_info(const plot_info &pi) const
Definition: TSASeriesTemplate.h:269
any_series_cref(const series< T > &other)
Definition: TSASeriesTemplate.h:1822
bool empty(void) const
Returns true if the series is empty.
Definition: TSASeriesTemplate.h:501
const T * data(void) const
Returns a pointer to the series data. The array length can be determined by calling size()...
Definition: TSASeriesTemplate.h:1098
bool is_numeric(void) const
Definition: TSASeriesTemplate.h:1850
Exception class thrown by series when insufficient data.
Definition: TSAError.h:103
sref< double > operator+(numeric_series_cref a, numeric_series_cref b)
Adds a and b.
Definition: TSADSLBase.cpp:32
const series< T > & operator[](size_t pos) const
Definition: TSASeriesTemplate.h:1456
bool crosses_below(const series< T > &other) const
Returns true if self crossed below other on the most recent value.
Definition: TSASeriesTemplate.h:1249
void operator=(series_cref< T > &)
Definition: TSASeriesTemplate.h:896
Parent class for many library classes.
Definition: TSATypeDef.h:462
bool crosses_above(const series< T > &other) const
Returns true if self crossed above other on the most recent value.
Definition: TSASeriesTemplate.h:1242
date_series_cref(const series< tsa::date > &other)
Definition: TSASeriesTemplate.h:1747
series_cref(const series_cref< T > &other)
Definition: TSASeriesTemplate.h:1289
sref< bool > operator<=(numeric_series_cref a, numeric_series_cref b)
comparison.
Definition: TSADSLBase.cpp:91
size_t size(void) const
Definition: TSASeriesTemplate.h:1901
A date of the Gregorian calendar.
Definition: TSATime.h:119
series_cref< T > operator()(size_t position)
Definition: TSASeriesTemplate.h:1478
virtual ~series(void)
Destructor.
Definition: TSASeriesTemplate.h:986
sref< bool > operator>=(numeric_series_cref a, numeric_series_cref b)
comparison.
Definition: TSADSLBase.cpp:117
sref< bool > operator==(numeric_series_cref a, numeric_series_cref b)
comparison.
Definition: TSADSLBase.cpp:130
const series< T > shift(size_t _shift_by) const
Returns a series that is a &#39;shifted&#39; version of the given in_series argument. The returned series wil...
Definition: TSASeriesTemplate.h:1154
const variant & pane_y_min(void) const
Definition: TSASeriesTemplate.h:205
void clear(void)
Clears the series. WARNING: This only works for &#39;unmanaged&#39; series. See is_managed().
Definition: TSASeriesTemplate.h:1000
series_tuple(const series_cref< T > &a, const series_cref< T > &b, const series_cref< T > &c)
Definition: TSASeriesTemplate.h:1446
static void reset_default_capacity(size_t new_capacity)
Sets the default capacity of new series to new_capacity.
Definition: TSASeriesTemplate.h:251
A container.
Definition: TSASeriesTemplate.h:1865
numeric_series_cref(const series_cref< int > &other)
Definition: TSASeriesTemplate.h:1562
series_cref< T > & plot_as(const plot_info &pi)
Definition: TSASeriesTemplate.h:1381
bool size_ok(size_t sz) const
Definition: TSASeriesTemplate.h:1792
series_cref< T > operator()(size_t shift_by) const
Definition: TSASeriesTemplate.h:423
An automatic cast bool series cref.
Definition: TSASeriesTemplate.h:1608
const series_template_base * get_ptr(void) const
Definition: TSASeriesTemplate.h:1831
void operator=(const series_cref< T > &other)
Definition: TSASeriesTemplate.h:1296
size_t size(void) const
Returns the number of values stored in the series.
Definition: TSASeriesTemplate.h:1138
any_series_cref(const series_template_base *other_ptr)
Definition: TSASeriesTemplate.h:1817
const series_cref< T > & plot_as(const std::string &name, const tsa::variant &period=0.0, plot_type type=plot_type::line, tsa::color clr=tsa::color::auto_color, unsigned weight=2) const
Definition: TSASeriesTemplate.h:1386
Information about the plot.
Definition: TSASeriesTemplate.h:161
size_t position(const std::string &name) const
Definition: TSASeriesTemplate.h:1465
const series_cref< T > & name(const std::string &name) const
Definition: TSASeriesTemplate.h:1374
A string series cref.
Definition: TSASeriesTemplate.h:1702
numeric_series_cref(const series< double > &other)
Definition: TSASeriesTemplate.h:1528
bool operator[](size_t pos) const
Definition: TSASeriesTemplate.h:1683
string_series_cref(const string_series_cref &other)
Definition: TSASeriesTemplate.h:1708
bool size_ok(size_t sz) const
Definition: TSASeriesTemplate.h:1648
The series cref.
Definition: TSASeriesProxy.h:25
bool is_managed(void) const
Query if this object is managed.
Definition: TSASeriesTemplate.h:995
bool is_equal(const series< T > &other) const
Returns true if self has same data as other.
Definition: TSASeriesTemplate.h:882
series(const std::string &auto_series_name)
Constructor.
Definition: TSASeriesTemplate.h:337
Represents a color for use in graphics operations.
Definition: TSATypeDef.h:1041
series(void)
Default constructor.
Definition: TSASeriesTemplate.h:352
A line.
Definition: TSASeriesTemplate.h:136
void print_v(std::ostream &s, size_t max=1000)
Prints the series to given stream, one data item per line. At most max items will be printed...
Definition: TSASeriesTemplate.h:1226
size_t size(void) const
Definition: TSASeriesTemplate.h:1454
void pane_dotted_grid(bool b)
Definition: TSASeriesTemplate.h:1361
series_cref(void)
Definition: TSASeriesTemplate.h:1283
series_tuple(const series_cref< T > &a, const series_cref< T > &b)
Definition: TSASeriesTemplate.h:1442
Class strategy represents a trading or investment strategy.
Definition: TSAStrategy.h:108
const variant & pane_y_max(void) const
Definition: TSASeriesTemplate.h:203
numeric_series_cref(const series_cref< uint64_t > &other)
Definition: TSASeriesTemplate.h:1574
series_cref< T > operator()(const std::string &name)
Definition: TSASeriesTemplate.h:1482
bool size_ok(size_t sz) const
Definition: TSASeriesTemplate.h:1335
void pane_y_max(double max) const
Definition: TSASeriesTemplate.h:189
void pane_show_grid(bool b)
Definition: TSASeriesTemplate.h:1359
const std::vector< tsa::h_line > & pane_h_lines(void) const
Definition: TSASeriesTemplate.h:1367
bool_series_cref(const series< bool > &other)
Definition: TSASeriesTemplate.h:1677
bool size_ok(size_t sz)
Definition: TSASeriesTemplate.h:1893
bool crosses_below(const series< double > &series_a, const series< double > &series_b)
Returns true when series_a crosses below series_b.
Definition: TSAFunctionsScalar.cpp:281
numeric_series_cref(const series_cref< float > &other)
Definition: TSASeriesTemplate.h:1558
Class representing a gregorian-date and time-of-day combination. The time component has microsecond r...
Definition: TSATime.h:428
int64_t identifier_t
type for ID&#39;s
Definition: TSATypeDef.h:117
void pane_h_line(const h_line &hl)
Definition: TSASeriesTemplate.h:1349
type_t value_type(void) const
Returns the data type of the values stored by the series.
Definition: TSASeriesTemplate.h:1236
size_t capacity(void) const
Returns the series capacity. Only available for &#39;unmanaged&#39; series. Throws an exception if the series...
Definition: TSASeriesTemplate.h:858
T get_at(size_t position) const
Returns the value at given position.
Definition: TSASeriesTemplate.h:1077
numeric_series_cref(const series_cref< double > &other)
Definition: TSASeriesTemplate.h:1554
void plot_as(const std::string &name, const std::vector< tsa::variant > &periods, plot_type type=plot_type::line, tsa::color clr=tsa::color::auto_color, unsigned weight=2) const
Plot as.
Definition: TSASeriesTemplate.h:300
sref< double > operator-(numeric_series_cref a, numeric_series_cref b)
Subtracts b from a.
Definition: TSADSLBase.cpp:37
bool crosses_above(const series< double > &series_a, const series< double > &series_b)
Returns true when series_a crosses above series_b.
Definition: TSAFunctionsScalar.cpp:276
void set_size(size_t new_size)
Sets the size of self to new_size. This is a quick way to &#39;make space&#39; without the overhead of callin...
Definition: TSASeriesTemplate.h:1024
void plot_as(const std::string &name, const tsa::variant &period=0.0, plot_type type=plot_type::line, tsa::color clr=tsa::color::auto_color, unsigned weight=2) const
Plot as.
Definition: TSASeriesTemplate.h:281
container(const container &other)
Definition: TSASeriesTemplate.h:1871
auto_cast_bool_series_cref(const series_cref< T > &other)
Definition: TSASeriesTemplate.h:1628
bool size_ok(size_t sz) const
Definition: TSASeriesTemplate.h:1722
any series cref.
Definition: TSASeriesTemplate.h:1807
sref< bool > operator<(numeric_series_cref a, numeric_series_cref b)
comparison.
Definition: TSADSLBase.cpp:78
virtual ~series_cref(void)
Definition: TSASeriesTemplate.h:1304
tsa::date_time operator[](size_t pos) const
Definition: TSASeriesTemplate.h:1788
void copy_pane_format(const pane_format &other) const
Definition: TSASeriesTemplate.h:207
void pane_y_min(double min) const
Definition: TSASeriesTemplate.h:191
const series< T > & name(const std::string &name) const
Names the given name.
Definition: TSASeriesTemplate.h:691
The series cref.
Definition: TSASeriesTemplate.h:1663
series_tuple(void)
Definition: TSASeriesTemplate.h:1436
A date series cref.
Definition: TSASeriesTemplate.h:1737