metadata.h
Go to the documentation of this file.
1 /*
2 * ECVL - European Computer Vision Library
3 * Version: 1.0.3
4 * copyright (c) 2020, Università degli Studi di Modena e Reggio Emilia (UNIMORE), AImageLab
5 * Authors:
6 * Costantino Grana (costantino.grana@unimore.it)
7 * Federico Bolelli (federico.bolelli@unimore.it)
8 * Michele Cancilla (michele.cancilla@unimore.it)
9 * Laura Canalini (laura.canalini@unimore.it)
10 * Stefano Allegretti (stefano.allegretti@unimore.it)
11 * All rights reserved.
12 */
13 
14 #ifndef ECVL_METADATA_H_
15 #define ECVL_METADATA_H_
16 
17 #include <functional>
18 #include <typeindex>
19 #include <unordered_map>
20 #include "ecvl/core/any.h"
21 
22 namespace ecvl
23 {
24 class MetaData
25 {
26  std::any value_;
27  std::string value_str_ = "";
28 
29  std::unordered_map<std::type_index, std::function<void(const std::any& value, std::string& s)>> anytype_to_string{
30  {std::type_index(typeid(std::string)), [](const std::any& x, std::string& s) {s = std::any_cast<std::string>(x); }},
31  {std::type_index(typeid(int)), [](const std::any& x, std::string& s) {s = std::to_string(std::any_cast<int>(x)); }},
32  {std::type_index(typeid(float)), [](const std::any& x, std::string& s) {s = std::to_string(std::any_cast<float>(x)); }},
33  {std::type_index(typeid(double)), [](const std::any& x, std::string& s) {s = std::to_string(std::any_cast<double>(x)); }},
34  {std::type_index(typeid(long)), [](const std::any& x, std::string& s) {s = std::to_string(std::any_cast<long>(x)); }},
35  {std::type_index(typeid(long long)), [](const std::any& x, std::string& s) {s = std::to_string(std::any_cast<long long>(x)); }},
36  {std::type_index(typeid(short)), [](const std::any& x, std::string& s) {s = std::to_string(std::any_cast<short>(x)); }},
37  {std::type_index(typeid(unsigned)), [](const std::any& x, std::string& s) {s = std::to_string(std::any_cast<unsigned>(x)); }},
38  {std::type_index(typeid(unsigned int)), [](const std::any& x, std::string& s) {s = std::to_string(std::any_cast<unsigned int>(x)); }},
39  {std::type_index(typeid(unsigned short)), [](const std::any& x, std::string& s) {s = std::to_string(std::any_cast<unsigned short>(x)); }},
40  };
41 
42 public:
43  // int is a workaround for some version of gcc bug: https://stackoverflow.com/questions/64744074/why-an-object-is-not-constructible?rq=1
44  MetaData(const std::any& value, int) : value_(value) {}
45  std::any Get() const { return value_; }
46  std::string GetStr()
47  {
48  if (const auto it = anytype_to_string.find(std::type_index(value_.type())); it != anytype_to_string.cend()) {
49  it->second(value_, value_str_);
50  }
51 
52  return value_str_;
53  }
54 };
55 } // namespace ecvl
56 
57 #endif // !ECVL_METADATA_H_
Definition: any.h:69
std::string GetStr()
Definition: metadata.h:46
std::any Get() const
Definition: metadata.h:45
std::experimental::any any
Definition: any.h:71
MetaData(const std::any &value, int)
Definition: metadata.h:44