add iteration interface to config
This commit is contained in:
@@ -2,6 +2,8 @@
|
||||
|
||||
#include "./config_model.inl"
|
||||
|
||||
#include <memory> // Q.Q
|
||||
|
||||
// TODO: events?
|
||||
struct ConfigModelI {
|
||||
~ConfigModelI(void) {}
|
||||
@@ -35,6 +37,53 @@ struct ConfigModelI {
|
||||
virtual CM_InternalOptional<int64_t> get_int(CM_ISV module, CM_ISV category) = 0;
|
||||
virtual CM_InternalOptional<double> get_double(CM_ISV module, CM_ISV category) = 0;
|
||||
virtual CM_InternalOptional<CM_ISV> get_string(CM_ISV module, CM_ISV category) = 0;
|
||||
|
||||
// iteration
|
||||
// actual range cant be virtual
|
||||
template<typename Type>
|
||||
struct ConstEntryProxy {
|
||||
struct ConstEntryIteratorI {
|
||||
virtual ~ConstEntryIteratorI(void) {}
|
||||
virtual std::unique_ptr<ConstEntryIteratorI> clone(void) = 0;
|
||||
virtual bool equal(const ConstEntryIteratorI& other) const = 0;
|
||||
virtual void incrementOne(void) = 0;
|
||||
//virtual const Type& getValue(void) const = 0;
|
||||
virtual Type getValue(void) const = 0;
|
||||
};
|
||||
|
||||
// actual iterator cant be virtual
|
||||
struct ConstEntryIterator {
|
||||
std::unique_ptr<ConstEntryIteratorI> _value;
|
||||
|
||||
// conversion
|
||||
//ConstEntryIterator(const std::unique_ptr<ConstEntryIteratorI>& other) { _value = other._value->clone(); }
|
||||
ConstEntryIterator(std::unique_ptr<ConstEntryIteratorI>&& value) { _value = std::move(value); }
|
||||
|
||||
// copy
|
||||
ConstEntryIterator(const ConstEntryIterator& other) { _value = other._value->clone(); }
|
||||
ConstEntryIterator& operator=(const ConstEntryIterator& other) { _value = other._value->clone(); return *this; }
|
||||
|
||||
// move
|
||||
ConstEntryIterator(ConstEntryIterator&& other) { _value = std::move(other._value); }
|
||||
|
||||
bool operator==(const ConstEntryIterator& other) const { return _value->equal(*other._value); }
|
||||
bool operator!=(const ConstEntryIterator& other) const { return !operator==(other); }
|
||||
ConstEntryIterator& operator++(void) { _value->incrementOne(); return *this; }
|
||||
Type operator*(void) const { return _value->getValue(); }
|
||||
};
|
||||
|
||||
ConstEntryIterator _begin;
|
||||
ConstEntryIterator _end;
|
||||
|
||||
const ConstEntryIterator& begin(void) const { return _begin; }
|
||||
const ConstEntryIterator& end(void) const { return _end; }
|
||||
};
|
||||
|
||||
// level 3
|
||||
virtual ConstEntryProxy<bool> entries_bool(CM_ISV module, CM_ISV category) const = 0;
|
||||
virtual ConstEntryProxy<int64_t> entries_int(CM_ISV module, CM_ISV category) const = 0;
|
||||
virtual ConstEntryProxy<double> entries_double(CM_ISV module, CM_ISV category) const = 0;
|
||||
virtual ConstEntryProxy<CM_ISV> entries_string(CM_ISV module, CM_ISV category) const = 0;
|
||||
};
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user