mc_rtc  2.16.0
ArrayLabel.h
Go to the documentation of this file.
1 /*
2  * Copyright 2015-2019 CNRS-UM LIRMM, CNRS-AIST JRL
3  */
4 
5 #pragma once
6 
7 #include <mc_rtc/gui/Label.h>
8 
9 namespace mc_rtc::gui
10 {
11 
12 namespace details
13 {
14 
23 template<typename GetT>
24 struct ArrayLabelImpl : public LabelImpl<GetT>
25 {
26  static constexpr auto type = Elements::ArrayLabel;
27 
28  ArrayLabelImpl(const std::string & name, GetT get_fn) : LabelImpl<GetT>(name, get_fn) {}
29 
30  ArrayLabelImpl(const std::string & name, const std::vector<std::string> & labels, GetT get_fn)
31  : LabelImpl<GetT>(name, get_fn), labels_(labels)
32  {
33  }
34 
37 
38  static constexpr size_t write_size() { return LabelImpl<GetT>::write_size() + 1; }
39 
41  {
42  LabelImpl<GetT>::write(writer);
43  writer.write(labels_);
44  }
45 
46 private:
47  std::vector<std::string> labels_;
48 };
49 
50 } // namespace details
51 
53 template<typename GetT, std::enable_if_t<std::is_invocable_v<GetT>, int> = 0>
54 auto ArrayLabel(const std::string & name, GetT get_fn)
55 { return details::ArrayLabelImpl(name, get_fn); }
56 
58 template<typename GetT, std::enable_if_t<std::is_invocable_v<GetT>, int> = 0>
59 auto ArrayLabel(const std::string & name, const std::vector<std::string> & labels, GetT get_fn)
60 { return details::ArrayLabelImpl(name, labels, get_fn); }
61 
66 template<typename T, std::enable_if_t<!std::is_invocable_v<T>, int> = 0>
67 auto ArrayLabel(const std::string & name, const std::vector<std::string> & labels, T && value)
68 { return ArrayLabel(name, labels, details::read(std::forward<T>(value))); }
69 
74 template<typename T, std::enable_if_t<!std::is_invocable_v<T>, int> = 0>
75 auto ArrayLabel(const std::string & name, T && value)
76 {
77  using Labels = details::Labels<std::decay_t<T>>;
78  auto callback = details::read(std::forward<T>(value));
79  if constexpr(Labels::has_labels) { return ArrayLabel(name, Labels::labels, callback); }
80  else
81  {
82  return details::ArrayLabelImpl(name, callback);
83  }
84 }
85 
90 template<bool Degrees = true, typename T>
91 auto RPYLabel(const std::string & name, T && value)
92 { return ArrayLabel(name, details::RPYLabels<Degrees>::labels, details::read_rpy<Degrees>(std::forward<T>(value))); }
93 
94 } // namespace mc_rtc::gui
std::optional< Eigen::VectorXd > value
auto read(const T &&value)
Definition: traits.h:184
Definition: Observer.h:16
auto ArrayLabel(const std::string &name, GetT get_fn)
Definition: ArrayLabel.h:54
auto RPYLabel(const std::string &name, T &&value)
Definition: ArrayLabel.h:91
Definition: MessagePackBuilder.h:87
void write(mc_rtc::MessagePackBuilder &builder)
Definition: elements.h:108
static constexpr size_t write_size()
Definition: elements.h:106
const std::string & name() const
Definition: elements.h:61
Definition: ArrayLabel.h:25
ArrayLabelImpl(const std::string &name, const std::vector< std::string > &labels, GetT get_fn)
Definition: ArrayLabel.h:30
static constexpr size_t write_size()
Definition: ArrayLabel.h:38
ArrayLabelImpl()
Definition: ArrayLabel.h:36
static constexpr auto type
Definition: ArrayLabel.h:26
void write(mc_rtc::MessagePackBuilder &writer)
Definition: ArrayLabel.h:40
ArrayLabelImpl(const std::string &name, GetT get_fn)
Definition: ArrayLabel.h:28
Definition: Label.h:23
Definition: traits.h:116
Definition: traits.h:172