Elements  6.0.1
A C++ base framework for the Euclid Software.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
Storage.tpp
Go to the documentation of this file.
1 
23 #ifndef ELEMENTSKERNEL_ELEMENTSKERNEL_STORAGE_IMPL_
24 #error "This file should not be included directly! Use ElementsKernel/Storage.h instead"
25 #else
26 
27 #include <cmath> // for pow, round
28 #include <cstdint> // for int64_t
29 
30 #include "ElementsKernel/Number.h" // for numberCast
31 
32 namespace Elements {
33 inline namespace Kernel {
34 namespace Units {
35 
36 template <typename T>
37 ELEMENTS_API T roundToDigits(const T& value, const size_t& max_digits) {
38  std::int64_t factor = std::int64_t(std::pow(10, max_digits));
39  return std::round(value * static_cast<T>(factor)) / static_cast<T>(factor);
40 }
41 
42 template <std::size_t max_digits, typename T>
43 ELEMENTS_API T storageConvert(const T& size, StorageType source_unit, StorageType target_unit) {
44 
45  using std::log10;
46 
47  T converted_value = size;
48 
49  if (source_unit != target_unit) {
50  T size_in_bytes = size * T(StorageFactor[source_unit]);
51  int64_t target_factor = StorageFactor[target_unit];
52  double value = roundToDigits(static_cast<double>(size_in_bytes) / static_cast<double>(target_factor), max_digits);
53  converted_value = Elements::numberCast<T>(value);
54  }
55 
56  return converted_value;
57 }
58 
59 template <typename T>
60 ELEMENTS_API T storageConvert(const T& size, StorageType source_unit, StorageType target_unit) {
61 
62  using std::log10;
63 
64  T converted_value = size;
65 
66  if (source_unit != target_unit) {
67  T size_in_bytes = size * T(StorageFactor[source_unit]);
68  int64_t target_factor = StorageFactor[target_unit];
69  double value = roundToDigits(static_cast<double>(size_in_bytes) / static_cast<double>(target_factor),
70  static_cast<size_t>(log10(static_cast<double>(target_factor))));
71  converted_value = Elements::numberCast<T>(value);
72  }
73 
74  return converted_value;
75 }
76 
77 } // namespace Units
78 } // namespace Kernel
79 } // namespace Elements
80 
81 #endif // ELEMENTSKERNEL_ELEMENTSKERNEL_STORAGE_IMPL_
ELEMENTS_API T storageConvert(const T &size, StorageType source_unit, StorageType target_unit)
T log10(T...args)
ELEMENTS_API std::map< StorageType, std::int64_t > StorageFactor
Definition: Storage.cpp:50
Casting with the correct (closest) rounding.
#define ELEMENTS_API
Dummy definitions for the backward compatibility mode.
Definition: Export.h:74
T pow(T...args)
T round(T...args)
ELEMENTS_API T roundToDigits(const T &value, const std::size_t &max_digits)