dimval 0.2.0
Modern C++23 header-only library of dimensional values (units, measures, ranges)
Loading...
Searching...
No Matches
interface.hpp
Go to the documentation of this file.
1#pragma once
2
17
18#include <dimval/descriptor.hpp>
19
20#include <memory>
21#include <string>
22#include <vector>
23
24namespace dimval {
25
28public:
29 IUnitValue() = default;
30 IUnitValue(const IUnitValue&) = default;
31 IUnitValue(IUnitValue&&) = default;
32 IUnitValue& operator=(const IUnitValue&) = default;
33 IUnitValue& operator=(IUnitValue&&) = default;
34 virtual ~IUnitValue() = default;
35
37 [[nodiscard]] virtual UnitDescriptor descriptor() const noexcept = 0;
39 [[nodiscard]] virtual double numeric_as_double() const noexcept = 0;
40
42 [[nodiscard]] virtual std::string to_string() const = 0;
44 [[nodiscard]] virtual std::string to_formatted_string() const = 0;
45
47 [[nodiscard]] virtual std::unique_ptr<IUnitValue> clone() const = 0;
48};
49
51using IUnitValueUnique = std::unique_ptr<IUnitValue>;
52using IUnitValueShared = std::shared_ptr<IUnitValue>;
53
55using IUnitValues = std::vector<IUnitValueShared>;
56using IUnitUniqueValues = std::vector<IUnitValueUnique>;
57
60public:
61 IMeasureValue() = default;
62 IMeasureValue(const IMeasureValue&) = default;
63 IMeasureValue(IMeasureValue&&) = default;
64 IMeasureValue& operator=(const IMeasureValue&) = default;
65 IMeasureValue& operator=(IMeasureValue&&) = default;
66 virtual ~IMeasureValue() = default;
67
69 [[nodiscard]] virtual MeasureDescriptor descriptor() const noexcept = 0;
71 [[nodiscard]] virtual UnitDescriptor unit_descriptor() const noexcept = 0;
72 [[nodiscard]] virtual double numeric_as_double() const noexcept = 0;
73
74 [[nodiscard]] virtual std::string to_string() const = 0;
75 [[nodiscard]] virtual std::string to_formatted_string() const = 0;
76 [[nodiscard]] virtual std::unique_ptr<IMeasureValue> clone() const = 0;
77};
78
80using IMeasureValueUnique = std::unique_ptr<IMeasureValue>;
81using IMeasureValueShared = std::shared_ptr<IMeasureValue>;
82
84using IMeasureValues = std::vector<IMeasureValueShared>;
85using IMeasureUniqueValues = std::vector<IMeasureValueUnique>;
86
87} // namespace dimval
Polymorphic interface implemented by every MeasureValue<M,T>.
Definition interface.hpp:59
virtual MeasureDescriptor descriptor() const noexcept=0
Measure descriptor — read fields like descriptor().name from here.
Polymorphic interface implemented by every UnitValue<U,T>.
Definition interface.hpp:27
virtual std::string to_string() const =0
Render <value> <symbol> (or whatever the descriptor's formatter dictates).
virtual UnitDescriptor descriptor() const noexcept=0
Full descriptor — read individual fields (descriptor().id, ...) from here.
virtual double numeric_as_double() const noexcept=0
Numeric value as a double (lossy for >double types).
virtual std::unique_ptr< IUnitValue > clone() const =0
Deep copy as the interface type — the moral equivalent of a virtual copy ctor.
virtual std::string to_formatted_string() const =0
Render with the descriptor's default precision applied.
Runtime metadata structs for units and measures.
std::unique_ptr< IMeasureValue > IMeasureValueUnique
Owning handles to a polymorphic IMeasureValue.
Definition interface.hpp:80
std::vector< IMeasureValueShared > IMeasureValues
Convenience aliases for collections of polymorphic values.
Definition interface.hpp:84
std::vector< IUnitValueShared > IUnitValues
Convenience aliases for collections of polymorphic values.
Definition interface.hpp:55
std::unique_ptr< IUnitValue > IUnitValueUnique
Owning handles to a polymorphic IUnitValue.
Definition interface.hpp:51
Runtime metadata for a measure (a semantic specialization of a unit).
Definition descriptor.hpp:54
Runtime metadata for a unit.
Definition descriptor.hpp:29