transform_function.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <QApplication>
4 #include <set>
5 #include "PlotJuggler/plotdata.h"
7 
8 namespace PJ {
9 
11 {
12  Q_OBJECT
13 public:
14 
16  {
17  init();
18  }
19 
20  virtual ~TimeSeriesTransform() {}
21 
22  void setDataSource(const PlotData *src_data){
23  _src_data = src_data;
24  }
25 
26  virtual void init()
27  {
29  }
30 
31  virtual const char* name() const = 0;
32 
33  void calculate(PlotData* dst_data)
34  {
35  if (_src_data->size() == 0)
36  {
37  return;
38  }
40  if (dst_data->size() != 0)
41  {
42  _last_timestamp = dst_data->back().x;
43  }
44 
46  size_t index = pos < 0 ? 0 : static_cast<size_t>(pos);
47 
48  while(index < _src_data->size())
49  {
50  const auto& in_point = _src_data->at(index);
51 
52  if (in_point.x >= _last_timestamp)
53  {
54  auto out_point = calculateNextPoint(index);
55  if (out_point){
56  dst_data->pushBack( out_point.value() );
57  }
58  _last_timestamp = in_point.x;
59  }
60  index++;
61  }
62  }
63 
64  const PlotData* dataSource() const{
65  return _src_data;
66  }
67 
68  QString alias() const {
69  return _alias;
70  }
71 
72  void setAlias(QString alias) {
73  _alias = alias;
74  }
75 
76 signals:
77  void parametersChanged();
78 
79 protected:
80 
82  QString _alias;
84 
86  calculateNextPoint(size_t index) = 0;
87 };
88 
89 using TimeSeriesTransformPtr = std::shared_ptr<TimeSeriesTransform>;
90 
92 
93 class TransformFactory: public QObject
94 {
95 public:
97 
98 private:
99  TransformFactory(const TransformFactory&) = delete;
100  TransformFactory& operator=(const TransformFactory&) = delete;
101 
102  std::map<std::string, std::function<TimeSeriesTransformPtr()>> creators_;
103  std::set<std::string> names_;
104 
105  static TransformFactory* instance();
106 
107 public:
108 
109  static const std::set<std::string>& registeredTransforms() {
110  return instance()->names_;
111  }
112 
113  template <typename T> static void registerTransform()
114  {
115  T temp;
116  std::string name = temp.name();
117  instance()->names_.insert(name);
118  instance()->creators_[name] = [](){ return std::make_shared<T>(); };
119  }
120 
121  static TimeSeriesTransformPtr create(const std::string& name)
122  {
123  auto it = instance()->creators_.find(name);
124  if( it == instance()->creators_.end())
125  {
126  return {};
127  }
128  return it->second();
129  }
130 };
131 
132 } // end namespace
133 
134 Q_DECLARE_OPAQUE_POINTER(PJ::TransformFactory *)
135 Q_DECLARE_METATYPE(PJ::TransformFactory *)
136 Q_GLOBAL_STATIC(PJ::TransformFactory, _transform_factory_ptr_from_macro)
137 
138 inline PJ::TransformFactory* PJ::TransformFactory::instance()
139 {
140  static TransformFactory * _ptr(nullptr);
141  if (!qApp->property("TransformFactory").isValid() && !_ptr) {
142  _ptr = _transform_factory_ptr_from_macro;
143  qApp->setProperty("TransformFactory", QVariant::fromValue(_ptr));
144  }
145  else if (!_ptr) {
146  _ptr = qvariant_cast<TransformFactory *>(qApp->property("TransformFactory"));
147  }
148  else if (!qApp->property("TransformFactory").isValid()) {
149  qApp->setProperty("TransformFactory", QVariant::fromValue(_ptr));
150  }
151  return _ptr;
152 }
153 
154 
155 QT_BEGIN_NAMESPACE
156 #define TimeSeriesTransform_iid "facontidavide.PlotJuggler3.TimeSeriesTransform"
158 QT_END_NAMESPACE
159 
const Point & back() const
Definition: plotdata.h:139
const Point & at(size_t index) const
Definition: plotdata.h:97
#define nullptr
Definition: backward.hpp:386
void setAlias(QString alias)
double maximumRangeX() const
Definition: plotdata.h:305
#define max(A, B)
Definition: Socket.h:88
---— The factory to create instances of a SeriesTransform ----------—
int getIndexFromX(double x) const
Definition: plotdata.h:545
void setMaximumRangeX(double max_range)
Definition: plotdata.h:299
std::shared_ptr< TimeSeriesTransform > TimeSeriesTransformPtr
void calculate(PlotData *dst_data)
virtual const char * name() const =0
std::map< std::string, std::function< TimeSeriesTransformPtr()> > creators_
const PlotData * _src_data
virtual size_t size() const
Definition: plotdata.h:92
std::set< std::string > names_
const PlotData * dataSource() const
static void registerTransform()
virtual nonstd::optional< PlotData::Point > calculateNextPoint(size_t index)=0
void pushBack(const Point &p)
Definition: plotdata.h:330
void setDataSource(const PlotData *src_data)
static const std::set< std::string > & registeredTransforms()
#define TimeSeriesTransform_iid
static TimeSeriesTransformPtr create(const std::string &name)


plotjuggler
Author(s): Davide Faconti
autogenerated on Sun Dec 6 2020 04:02:48