35 #ifndef BM_BM_SIM_METERS_H_
36 #define BM_BM_SIM_METERS_H_
73 using color_t =
unsigned int;
74 using rate_idx_t = size_t;
75 struct rate_config_t {
79 static rate_config_t make(
double info_rate,
size_t burst_size) {
80 return {info_rate, burst_size};
83 using clock = std::chrono::steady_clock;
86 enum class MeterType {
96 INVALID_INFO_RATE_VALUE,
97 INVALID_BURST_SIZE_VALUE,
102 Meter(MeterType type,
size_t rate_count)
103 : type(type), rates(rate_count) { }
110 template<
typename RAIt>
111 MeterErrorCode set_rates(
const RAIt first,
const RAIt last) {
114 std::is_same<std::random_access_iterator_tag,
115 typename std::iterator_traits<RAIt>::iterator_category>::value,
116 "wrong iterator category");
118 std::is_same<rate_config_t,
119 typename std::iterator_traits<RAIt>::value_type>::value,
120 "wrong iterator value type");
121 typename std::iterator_traits<RAIt>::difference_type n =
122 std::distance(first, last);
124 auto lock = unique_lock();
125 if (
static_cast<size_t>(n) != rates.size())
return BAD_RATES_LIST;
127 for (
auto it = first; it < last; ++it) {
128 MeterErrorCode rc = set_rate(idx++, *it);
129 if (rc != SUCCESS)
return rc;
131 std::reverse(rates.begin(), rates.end());
136 MeterErrorCode set_rates(
const std::vector<rate_config_t> &configs) {
137 return set_rates(configs.begin(), configs.end());
140 MeterErrorCode set_rates(
141 const std::initializer_list<rate_config_t> &configs) {
142 return set_rates(configs.begin(), configs.end());
146 std::vector<rate_config_t> get_rates()
const;
148 MeterErrorCode reset_rates();
160 void serialize(std::ostream *out)
const;
161 void deserialize(std::istream *in);
165 static void reset_global_clock();
168 using UniqueLock = std::unique_lock<std::mutex>;
169 UniqueLock unique_lock()
const {
return UniqueLock(*m_mutex); }
170 void unlock(UniqueLock &lock)
const { lock.unlock(); }
178 uint64_t tokens_last{};
183 MeterErrorCode set_rate(
size_t idx,
const rate_config_t &config);
190 std::unique_ptr<std::mutex> m_mutex{
new std::mutex()};
192 std::vector<MeterRate> rates;
193 bool configured{
false};
196 using meter_array_id_t = p4object_id_t;
210 using MeterErrorCode = Meter::MeterErrorCode;
211 using color_t = Meter::color_t;
212 using MeterType = Meter::MeterType;
213 using rate_config_t = Meter::rate_config_t;
215 using iterator = std::vector<Meter>::iterator;
216 using const_iterator = std::vector<Meter>::const_iterator;
219 MeterArray(
const std::string &name, p4object_id_t
id,
220 MeterType type,
size_t rate_count,
size_t size);
228 MeterErrorCode set_rates(
const RAIt first,
const RAIt last) {
231 for (
Meter &m : meters) {
232 rc = m.set_rates(first, last);
233 if (rc != MeterErrorCode::SUCCESS)
return rc;
235 return MeterErrorCode::SUCCESS;
238 MeterErrorCode set_rates(
const std::vector<rate_config_t> &configs);
240 MeterErrorCode set_rates(
241 const std::initializer_list<rate_config_t> &configs);
257 return meters.at(idx);
262 return meters.at(idx);
267 assert(idx <
size());
273 assert(idx <
size());
280 iterator
begin() {
return meters.begin(); }
283 const_iterator
begin()
const {
return meters.begin(); }
286 iterator
end() {
return meters.end(); }
289 const_iterator
end()
const {
return meters.end(); }
292 size_t size()
const {
return meters.size(); }
296 void serialize(std::ostream *out)
const;
297 void deserialize(std::istream *in);
300 std::vector<Meter> meters{};
305 #endif // BM_BM_SIM_METERS_H_