icedb  version 0.5.1
Snow particle scattering database API
units.cpp
Go to the documentation of this file.
1 #include <string>
2 #include "../icedb/units/units.hpp"
3 #include "../private/unitsBackend.hpp"
4 #include "../icedb/units/unitsPlugins.hpp"
5 #include "../private/options.hpp"
6 #include "../icedb/error.hpp"
7 #include "../icedb/logging.hpp"
8 
9 namespace icedb {
10  namespace units {
12 
13  std::shared_ptr<const converter> converter::generate(
14  const std::string &inUnits, const std::string &outUnits) {
15  converter_p res;
16  res = implementations::_queryBackend(inUnits, outUnits, "");
17  if (!res) {
18  res = converter_p(new converter(inUnits, outUnits));
19  implementations::_registerBackend(inUnits, outUnits, "", res);
20  }
21  return res;
22  }
23  converter::converter(const std::string &inUnits, const std::string &outUnits)
24  {
25  h = getConverter(inUnits, outUnits);
26  }
27 
28  bool converter::canConvert(const std::string &inUnits, const std::string &outUnits) {
29  implementations::_init(); // Static function that registers the builtin unit converters.
30  //SDBR_log("units", scatdb::logging::ICEDB_LOG_NORMAL,
31  // "Creating converter for " << inUnits << " to " << outUnits);
32  auto hooks = implementations::getHooks();
33  // hull_provider_registry, hull_provider<convexHull> >::getHooks();
34  //std::cerr << hooks->size() << std::endl;
35  auto opts = registry::options::generate();
36  opts->setVal<std::string>("inUnits", inUnits);
37  opts->setVal<std::string>("outUnits", outUnits);
38  for (const auto &i : *(hooks.get()))
39  {
40  if (!i->canConvert) continue;
41  if (!i->constructConverter) continue;
42  if (!i->canConvert(opts)) continue;
43  return true;
44  }
45  return false;
46  }
47 
48  bool converter::isValid() const {
49  if (h) return h->isValid();
50  return false;
51  }
52  double converter::convert(double in) const {
53  if (!h)
55  .add<std::string>("Reason", "Converter handler is null. Probably incompatible units.");
56  if (!isValid())
58  .add<std::string>("Reason", "Conversion between the two specified units is invalid.");
59  return h->convert(in);
60  }
62 
64  conv_spec::conv_spec(const std::string &in, const std::string &out)
65  : converter()
66  {
67  implementations::_init(); // Static function that registers the builtin unit converters.
69  "Creating spectrum converter for " << in << " to " << out);
70 
71  auto opts = registry::options::generate();
72  opts->setVal<std::string>("inUnits", in);
73  opts->setVal<std::string>("outUnits", out);
75 
76  }
77  std::shared_ptr<const converter> conv_spec::generate(
78  const std::string &inUnits, const std::string &outUnits) {
79  converter_p res;
80  res = implementations::_queryBackend(inUnits, outUnits, "spec");
81  if (!res) {
82  res = converter_p(new conv_spec(inUnits, outUnits));
83  implementations::_registerBackend(inUnits, outUnits, "spec", res);
84  }
85  return res;
86  }
87  }
88 }
89 
static Unithandler_p getConverter(const std::string &inUnits, const std::string &outUnits)
bool isValid() const
Is this conversion valid?
Definition: units.cpp:48
static std::shared_ptr< options > generate()
Definition: options.cpp:18
virtual ~converter()
Definition: units.cpp:61
static std::shared_ptr< const implementations::Unithandler > constructConverter(Converter_registry_provider::optsType opts)
#define ICEDB_throw(x)
Definition: error.hpp:88
Unithandler_p h
Definition: units.hpp:48
static bool canConvert(const std::string &inUnits, const std::string &outUnits)
Check if two units can be interconverted.
Definition: units.cpp:28
void _registerBackend(const std::string &inUnits, const std::string &outUnits, const std::string &family, converter_p p)
converter_p _queryBackend(const std::string &inUnits, const std::string &outUnits, const std::string &family)
static std::shared_ptr< const converter > generate(const std::string &inUnits, const std::string &outUnits)
Definition: units.cpp:77
static std::shared_ptr< const converter > generate(const std::string &inUnits, const std::string &outUnits)
Definition: units.cpp:13
Base conversion class.
Definition: units.hpp:26
virtual double convert(double inVal) const
Definition: units.cpp:52
#define ICEDB_log(c, p, x)
Definition: logging.hpp:45
conv_spec(const std::string &inUnits, const std::string &outUnits)
Definition: units.cpp:64
std::shared_ptr< const converter > converter_p
Definition: units.hpp:16