icedb  version 0.5.1
Snow particle scattering database API
Public Member Functions | Static Public Member Functions | Protected Member Functions | Static Protected Member Functions | Protected Attributes | Friends | List of all members
icedb::units::converter Class Reference

Base conversion class. More...

#include <units.hpp>

Inheritance diagram for icedb::units::converter:
Inheritance graph
[legend]

Public Member Functions

virtual ~converter ()
 
virtual double convert (double inVal) const
 
bool isValid () const
 Is this conversion valid? More...
 
 converter (const std::string &inUnits, const std::string &outUnits)
 

Static Public Member Functions

static bool canConvert (const std::string &inUnits, const std::string &outUnits)
 Check if two units can be interconverted. More...
 
static std::shared_ptr< const convertergenerate (const std::string &inUnits, const std::string &outUnits)
 

Protected Member Functions

 converter ()
 

Static Protected Member Functions

static Unithandler_p getConverter (const std::string &inUnits, const std::string &outUnits)
 

Protected Attributes

Unithandler_p h
 

Friends

struct implementations::spectralUnits
 
struct implementations::simpleUnits
 
struct implementations::Unithandler
 

Detailed Description

Base conversion class.

Class is virtual. May be overridden with classes that do formulaic operations, such as converters to density in ppmv.

Now, with the appropriate DLL loaded, the udunits system will be used for most conversions. The derived classes still have a bit of code for when udunits is not installed.

Definition at line 26 of file units.hpp.

Constructor & Destructor Documentation

◆ ~converter()

icedb::units::converter::~converter ( )
virtual

Definition at line 61 of file units.cpp.

61 {}

◆ converter() [1/2]

icedb::units::converter::converter ( const std::string &  inUnits,
const std::string &  outUnits 
)

Definition at line 23 of file units.cpp.

References getConverter(), and h.

24  {
25  h = getConverter(inUnits, outUnits);
26  }
static Unithandler_p getConverter(const std::string &inUnits, const std::string &outUnits)
Unithandler_p h
Definition: units.hpp:48
Here is the call graph for this function:

◆ converter() [2/2]

icedb::units::converter::converter ( )
protected

Definition at line 11 of file units.cpp.

References icedb::units::implementations::_init().

Referenced by generate().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Function Documentation

◆ canConvert()

bool icedb::units::converter::canConvert ( const std::string &  inUnits,
const std::string &  outUnits 
)
static

Check if two units can be interconverted.

Definition at line 28 of file units.cpp.

References icedb::units::implementations::_init(), icedb::registry::options::generate(), and icedb::units::implementations::getHooks().

Referenced by icedb::units::implementations::spectralUnits::canConvert(), and icedb::units::implementations::spectralUnits::constructConverter().

28  {
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  }
static std::shared_ptr< options > generate()
Definition: options.cpp:18
Here is the call graph for this function:
Here is the caller graph for this function:

◆ convert()

double icedb::units::converter::convert ( double  inVal) const
virtual

Convert to the output units

Exceptions
Ifthe conversion is invalid

Definition at line 52 of file units.cpp.

References h, ICEDB_throw, isValid(), icedb::error::xBadInput, and icedb::error::xNullPointer.

Referenced by icedb::refract::implementations::mIceWarren().

52  {
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  }
bool isValid() const
Is this conversion valid?
Definition: units.cpp:48
#define ICEDB_throw(x)
Definition: error.hpp:88
Unithandler_p h
Definition: units.hpp:48
Here is the call graph for this function:
Here is the caller graph for this function:

◆ generate()

std::shared_ptr< const converter > icedb::units::converter::generate ( const std::string &  inUnits,
const std::string &  outUnits 
)
static

Create a converter to convert between two types of units.

Returns
nullptr if no valid converter can be created for these units.

Definition at line 13 of file units.cpp.

References icedb::units::implementations::_queryBackend(), icedb::units::implementations::_registerBackend(), and converter().

Referenced by icedb::refract::prepRefract().

14  {
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  }
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)
std::shared_ptr< const converter > converter_p
Definition: units.hpp:16
Here is the call graph for this function:
Here is the caller graph for this function:

◆ getConverter()

std::shared_ptr< const implementations::Unithandler > icedb::units::converter::getConverter ( const std::string &  inUnits,
const std::string &  outUnits 
)
staticprotected

Get a converter for these units.

Returns
nullptr if no valid converter can be created

Definition at line 69 of file unitsPlugins.cpp.

References icedb::units::implementations::_init(), icedb::registry::options::generate(), icedb::units::implementations::getHooks(), ICEDB_log, and icedb::logging::ICEDB_LOG_DEBUG_1.

Referenced by icedb::units::implementations::spectralUnits::constructConverter(), and converter().

70  {
71  implementations::_init(); // Static function that registers the builtin unit converters.
72 
73  const auto &hooks = implementations::getHooks();
74  // hull_provider_registry, hull_provider<convexHull> >::getHooks();
75  //std::cerr << hooks->size() << std::endl;
76  auto opts = registry::options::generate();
77  opts->setVal<std::string>("inUnits", inUnits);
78  opts->setVal<std::string>("outUnits", outUnits);
79  for (const auto &i : *(hooks.get()))
80  {
81  if (!i->canConvert) continue;
82  if (!i->constructConverter) continue;
83  if (!i->canConvert(opts)) continue;
84  return i->constructConverter(opts);
85  }
86  // Only return nullptr if unable to find a usable hook.
87  ICEDB_log("units", icedb::logging::ICEDB_LOG_DEBUG_1, "No handler for unit conversion found for "
88  "conversions between " << inUnits << " and " << outUnits << ".");
89  // We don;t want to throw an error here. Only throw if a conversion is actually attempted.
90  // Otherwise, we quash the purpose of isValid().
91  //ICEDB_throw(icedb::error::error_types::xBadInput)
92  // .add<std::string>("Reason", "There is no code which can handle this unit conversion.")
93  // .add<std::string>("inUnits", inUnits)
94  // .add<std::string>("outUnits", outUnits)
95  // ;
96  return nullptr;
97  }
static std::shared_ptr< options > generate()
Definition: options.cpp:18
#define ICEDB_log(c, p, x)
Definition: logging.hpp:45
Here is the call graph for this function:
Here is the caller graph for this function:

◆ isValid()

bool icedb::units::converter::isValid ( ) const

Is this conversion valid?

Definition at line 48 of file units.cpp.

References h.

Referenced by convert(), and main().

48  {
49  if (h) return h->isValid();
50  return false;
51  }
Unithandler_p h
Definition: units.hpp:48
Here is the caller graph for this function:

Friends And Related Function Documentation

◆ implementations::simpleUnits

friend struct implementations::simpleUnits
friend

Definition at line 50 of file units.hpp.

◆ implementations::spectralUnits

friend struct implementations::spectralUnits
friend

Definition at line 49 of file units.hpp.

◆ implementations::Unithandler

friend struct implementations::Unithandler
friend

Definition at line 51 of file units.hpp.

Member Data Documentation

◆ h

Unithandler_p icedb::units::converter::h
protected

Definition at line 48 of file units.hpp.

Referenced by icedb::units::conv_spec::conv_spec(), convert(), converter(), and isValid().


The documentation for this class was generated from the following files: