QtPdCom  1.4.2
Transmission.h
Go to the documentation of this file.
1 /*****************************************************************************
2  *
3  * Copyright (C) 2022 Florian Pose <fp@igh.de>
4  *
5  * This file is part of the QtPdCom library.
6  *
7  * The QtPdCom library is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU Lesser General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or (at your
10  * option) any later version.
11  *
12  * The QtPdCom library is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14  * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15  * License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public License
18  * along with the QtPdCom Library. If not, see <http://www.gnu.org/licenses/>.
19  *
20  ****************************************************************************/
21 
22 #ifndef QTPDCOM_TRANSMISSION_H
23 #define QTPDCOM_TRANSMISSION_H
24 
25 #include <pdcom5/Subscriber.h> // PdCom::Transmission
26 
27 #include "Export.h"
28 
29 #include <chrono>
30 #include <stdexcept>
31 
32 namespace QtPdCom {
33 
34 /****************************************************************************/
35 
37 constexpr struct event_mode_tag
38 {
39 } event_mode;
40 
42 constexpr struct poll_mode_tag
43 {
44 } poll_mode;
45 
47 constexpr struct manual_poll_mode_tag
48 {
50 
52 {
53  public:
54  template <typename T, typename R>
55  constexpr Poll(std::chrono::duration<T, R> d):
56  interval_(checkInterval(
57  std::chrono::duration_cast<std::chrono::duration<double>>(
58  d)))
59  {}
60 
61  constexpr std::chrono::duration<double> getInterval() const
62  {
63  return interval_;
64  }
65 
66  private:
67  std::chrono::duration<double> interval_;
68 
69  static constexpr std::chrono::duration<double>
70  checkInterval(std::chrono::duration<double> d)
71  {
72  return d.count() <= 0
73  ? throw std::invalid_argument(
74  "Poll period must be greater than zero")
75  : d;
76  }
77 };
78 
86 {
87  public:
88  Transmission() = delete;
89  constexpr double getInterval() const noexcept { return interval_; }
90 
91  template <typename T, typename R>
92  constexpr Transmission(std::chrono::duration<T, R> d):
93  mode_(Continuous),
94  interval_(checkInterval(
95  std::chrono::duration_cast<std::chrono::duration<double>>(
96  d)
97  .count()))
98  {}
99 
100  constexpr Transmission(event_mode_tag) noexcept:
101  mode_(Event),
102  interval_(0.0)
103  {}
104 
105  constexpr Transmission(manual_poll_mode_tag) noexcept:
106  mode_(ManualPoll),
107  interval_(0.0)
108  {}
109 
110  constexpr Transmission(poll_mode_tag, double interval):
111  mode_(Poll),
112  interval_(checkInterval(interval))
113  {}
114 
115  constexpr Transmission(const Poll &poll):
116  mode_(Poll),
117  interval_(poll.getInterval().count())
118  {}
119 
120  bool operator==(const Transmission &o) const noexcept
121  {
122  return o.interval_ == interval_ and o.mode_ == mode_;
123  }
124 
125  constexpr bool isContinuous() const
126  {
127  return mode_ == Continuous and interval_ > 0.0;
128  }
129 
130  constexpr bool isPoll() const
131  {
132  return mode_ == Poll and interval_ > 0.0;
133  }
134 
135  PdCom::Transmission toPdCom() const;
136  QString toString() const;
137 
138  private:
139  enum { Poll = -1, ManualPoll, Event, Continuous } mode_;
140 
141  double interval_;
142 
143  static constexpr double checkInterval(double d)
144  {
145  return d <= 0 ? throw std::invalid_argument(
146  "Interval must be greater than zero")
147  : d;
148  }
149 };
150 
151 /****************************************************************************/
152 
153 } // namespace QtPdCom
154 
155 #endif
static constexpr double checkInterval(double d)
Definition: Transmission.h:143
constexpr double getInterval() const noexcept
Definition: Transmission.h:89
Tag for event-based subscription.
Definition: Transmission.h:37
Transmission mode for subscriptions.
Definition: Transmission.h:85
constexpr bool isContinuous() const
Definition: Transmission.h:125
Definition: BroadcastModel.h:32
constexpr Transmission(manual_poll_mode_tag) noexcept
Definition: Transmission.h:105
constexpr Poll(std::chrono::duration< T, R > d)
Definition: Transmission.h:55
constexpr Transmission(const Poll &poll)
Definition: Transmission.h:115
#define QTPDCOM_PUBLIC
Definition: Export.h:30
std::chrono::duration< double > interval_
Definition: Transmission.h:67
static constexpr std::chrono::duration< double > checkInterval(std::chrono::duration< double > d)
Definition: Transmission.h:70
Tag for poll-based subscription without timer.
Definition: Transmission.h:47
constexpr bool isPoll() const
Definition: Transmission.h:130
double interval_
Definition: Transmission.h:141
Tag for poll-based subscription with timer.
Definition: Transmission.h:42
constexpr std::chrono::duration< double > getInterval() const
Definition: Transmission.h:61
constexpr Transmission(poll_mode_tag, double interval)
Definition: Transmission.h:110
constexpr Transmission(event_mode_tag) noexcept
Definition: Transmission.h:100
Definition: Transmission.h:51
bool operator==(const Transmission &o) const noexcept
Definition: Transmission.h:120
constexpr struct QtPdCom::poll_mode_tag poll_mode
constexpr struct QtPdCom::manual_poll_mode_tag manual_poll_mode
constexpr Transmission(std::chrono::duration< T, R > d)
Definition: Transmission.h:92
constexpr struct QtPdCom::event_mode_tag event_mode