ifw-daq  1.0.0
IFW Data Acquisition modules
keyword.cpp
Go to the documentation of this file.
1 /**
2  * @file
3  * @ingroup daq_ocm_libfits
4  * @copyright 2021 ESO - European Southern Observatory
5  *
6  * @brief Definition of contents from fits/keyword.hpp
7  */
8 #include <daq/fits/keyword.hpp>
9 #include <algorithm>
10 #include <ostream>
11 
12 namespace {
13 template <class>
14 inline constexpr bool always_false_v = false; // NOLINT
15 template <class T>
16 char const* TypeStr() noexcept;
17 template <>
18 char const* TypeStr<uint64_t>() noexcept {
19  return "uint64_t";
20 }
21 template <>
22 char const* TypeStr<int64_t>() noexcept {
23  return "int64_t";
24 }
25 template <>
26 char const* TypeStr<double>() noexcept {
27  return "double";
28 }
29 
30 } // namespace
31 
32 namespace daq::fits {
33 // Instantiate the different variants
34 template struct BasicKeyword<ValueKeywordTraits>;
35 template struct BasicKeyword<EsoKeywordTraits>;
36 
37 template std::ostream&
39 
40 template std::ostream&
42 
43 template <class Trait>
44 BasicKeyword<Trait>::BasicKeyword(std::string name_arg,
45  char const* string_value,
46  std::optional<std::string> comment_arg)
47  : name(std::move(name_arg)), value(std::string(string_value)), comment(std::move(comment_arg)) {
48 }
49 
50 template <class Trait>
51 BasicKeyword<Trait>::BasicKeyword(std::string name_arg,
52  ValueType value_arg,
53  std::optional<std::string> comment_arg) noexcept
54  : name(std::move(name_arg)), value(std::move(value_arg)), comment(std::move(comment_arg)) {
55 }
56 
57 template <class Trait>
58 bool BasicKeyword<Trait>::operator==(BasicKeyword<Trait> const& rhs) const noexcept {
59  return name == rhs.name && value == rhs.value && comment == rhs.comment;
60 }
61 
62 template <class Trait>
63 bool BasicKeyword<Trait>::operator!=(BasicKeyword<Trait> const& rhs) const noexcept {
64  return !(*this == rhs);
65 }
66 
67 template <class Trait>
68 bool BasicKeyword<Trait>::operator<(BasicKeyword<Trait> const& rhs) const noexcept {
69  return name < rhs.name;
70 }
71 
72 
73 bool NameEquals(KeywordVariant const& lhs, KeywordVariant const& rhs) noexcept {
74  if (lhs.index() != rhs.index()) {
75  return false;
76  }
77  return std::visit(
78  [&](auto const& lhs, auto const& rhs) noexcept -> bool {
79  return lhs.name == rhs.name;
80  },
81  lhs, rhs);
82 }
83 
84 std::ostream& operator<<(std::ostream& os, BasicKeywordBase::ValueType const& kw) {
85  std::visit(
86  [&](auto const& var) mutable {
87  using T = std::decay_t<decltype(var)>;
88  if constexpr (std::is_same_v<T, std::string>) {
89  os << "(str)'" << var << "'";
90  } else if constexpr (std::is_same_v<T, bool>) {
91  os << "(bool)" << (var ? "true" : "false");
92  } else {
93  os << "(" << TypeStr<T>() << ")" << var;
94  }
95  },
96  kw);
97  return os;
98 }
99 
100 template <class Trait>
101 std::ostream& operator<<(std::ostream& os, BasicKeyword<Trait> const& kw) {
102  os << "name='" << kw.name << "', value=" << kw.value << ", comment=";
103  if (kw.comment) {
104  os << "'" << *kw.comment << "'";
105  } else {
106  os << "n/a";
107  }
108  return os;
109 }
110 
111 std::ostream& operator<<(std::ostream& os, KeywordVariant const& kw) {
112  std::visit(
113  [&](auto const& var) mutable {
114  os << var;
115  },
116  kw);
117  return os;
118 }
119 
121  for (auto const& kw : from) {
122  if (auto it = std::find_if(
123  to.begin(), to.end(), [&](auto const& val) { return NameEquals(val, kw); });
124  it != to.end()) {
125  // Replace existing keyword with same name (and type)
126  *it = kw;
127  } else {
128  // Otherwise append
129  to.emplace_back(kw);
130  }
131  }
132 }
133 
134 } // namespace daq::fits
daq::fits::KeywordVariant
std::variant< ValueKeyword, EsoKeyword > KeywordVariant
The different variants of keywords that are supported.
Definition: keyword.hpp:131
daq::fits::operator<<<EsoKeywordTraits >
template std::ostream & operator<<<EsoKeywordTraits >(std::ostream &os, BasicKeyword< EsoKeywordTraits > const &kw)
daq::fits::BasicKeyword::BasicKeyword
BasicKeyword()=default
keyword.hpp
Contains data structure for FITS keywords.
daq::fits::NameEquals
bool NameEquals(KeywordVariant const &lhs, KeywordVariant const &rhs) noexcept
Compare keyword names of keyword of the same type.
Definition: keyword.cpp:73
daq::fits::UpdateKeywords
void UpdateKeywords(KeywordVector &to, KeywordVector const &from)
Updates a with keywords from b.
Definition: keyword.cpp:120
daq::fits::BasicKeywordBase::ValueType
std::variant< std::string, int64_t, uint64_t, double, bool > ValueType
Definition: keyword.hpp:28
daq::fits
Definition: cfitsio.cpp:14
daq::fits::BasicKeyword::operator<
bool operator<(BasicKeyword const &rhs) const noexcept
Uses name property as the sorting index.
Definition: keyword.cpp:68
daq::fits::BasicKeyword
A type safe version of FormattedKeyword that consist of the three basic components of a FITS keyword ...
Definition: keyword.hpp:51
daq::fits::BasicKeyword::comment
std::optional< std::string > comment
Definition: keyword.hpp:81
daq::fits::operator<<
std::ostream & operator<<(std::ostream &os, BasicKeyword< Trait > const &kw)
Definition: keyword.cpp:101
daq::fits::BasicKeyword::value
ValueType value
Definition: keyword.hpp:80
daq::fits::operator<<<ValueKeywordTraits >
template std::ostream & operator<<<ValueKeywordTraits >(std::ostream &os, BasicKeyword< ValueKeywordTraits > const &kw)
daq::fits::KeywordVector
std::vector< KeywordVariant > KeywordVector
Vector of keywords.
Definition: keyword.hpp:138
daq::fits::BasicKeyword::operator!=
bool operator!=(BasicKeyword const &rhs) const noexcept
Compares all members for inequality.
Definition: keyword.cpp:63
daq::fits::BasicKeyword::name
std::string name
Definition: keyword.hpp:79
daq::fits::BasicKeyword::operator==
bool operator==(BasicKeyword const &rhs) const noexcept
Compares all members for equality.
Definition: keyword.cpp:58