settings - part 3

This commit is contained in:
Vadim Lopatin 2015-02-02 17:56:50 +03:00
parent 45ef53745d
commit d2e37e38b8
1 changed files with 83 additions and 7 deletions

View File

@ -15,25 +15,43 @@ interface Settings {
string getString(string key, string defValue = null);
/// set string for key, returns old value or null if not set
string setString(string key, string value);
/// get string by index, returns defValue if no such key
string getString(int index, string defValue = null);
/// set string for index, returns old value or null if not set
string setString(int index, string value);
/// get bool by key, returns defValue if no such key
bool getBool(string key, bool defValue = false);
/// set bool for key, returns old value or null if not set
/// set bool for key, returns old value or false if not set
bool setBool(string key, bool value);
/// get bool by index, returns defValue if no such key
bool getBool(int index, bool defValue = false);
/// set bool for index, returns old value or false if not set
bool setBool(int index, bool value);
/// get bool by key, returns defValue if no such key
int getInt(string key, int defValue = 0);
/// set bool for key, returns old value or null if not set
/// set bool for key, returns old value or 0 if not set
int setInt(string key, int value);
/// get bool by index, returns defValue if no such key
int getInt(int index, int defValue = 0);
/// set bool for index, returns old value or 0 if not set
int setInt(int index, int value);
/// remove setting, returns true if removed, false if no such key
bool remove(string key);
/// child subsettings access
/// child subsettings access by string key
Settings child(string key, bool createIfNotExist = false);
/// child subsettings access by index
Settings child(int index, bool createIfNotExist = false);
/// returns number of number-indexed items
@property int length();
}
/// implementation of settings object
class SettingsImpl : Settings {
protected SettingsImpl _parent;
protected SettingsImpl[string] _children;
protected SettingsImpl[] _indexedChildren;
protected string[string] _values;
protected string[] _indexedValues;
this(SettingsImpl parent = null) {
_parent = parent;
@ -44,6 +62,34 @@ class SettingsImpl : Settings {
return _parent;
}
/// get string by index, returns defValue if no such key
override string getString(int index, string defValue = null) {
if (index < 0 || index >= _indexedValues.length)
return defValue;
string res = _indexedValues[index];
if (!res)
return defValue;
return res;
}
/// set string for index, returns old value or null if not set
override string setString(int index, string value) {
assert(index >= 0);
assert(index < 10000);
string res;
if (index >= 0 && index < _indexedValues.length)
res = _indexedValues[index];
if (_indexedValues.length <= index)
_indexedValues.length = !_indexedValues.length ? 8 : index * 2;
_indexedValues[index] = value;
if (index < _indexedChildren.length)
_indexedChildren[index] = null;
return res;
}
/// returns number of number-indexed items
override @property int length() {
return cast(int)max(_indexedValues.length, _indexedChildren.length);
}
private static bool splitKey(string key, ref string part1, ref string part2) {
int dashPos = -1;
for (int i = 0; i < key.length; i++) {
@ -140,6 +186,20 @@ class SettingsImpl : Settings {
}
}
/// child subsettings access by index
override Settings child(int index, bool createIfNotExist = false) {
assert(index >= 0);
if (_indexedChildren.length <= index && createIfNotExist)
_indexedChildren.length = !_indexedChildren.length ? 8 : index * 2;
Settings res = index < _indexedChildren.length ? _indexedChildren[index] : null;
if (res || !createIfNotExist)
return res;
SettingsImpl newItem = new SettingsImpl(this);
_indexedChildren[index] = newItem;
if (index < _indexedValues.length)
_indexedValues[index] = null;
return newItem;
}
/// remove setting, returns true if removed, false if no such key
bool remove(string key) {
@ -199,20 +259,36 @@ class SettingsImpl : Settings {
}
/// get bool by key, returns defValue if no such key
bool getBool(string key, bool defValue = false) {
override bool getBool(string key, bool defValue = false) {
return parseBool(getString(key, ""), defValue);
}
/// set bool for key, returns old value or null if not set
bool setBool(string key, bool value) {
override bool setBool(string key, bool value) {
return parseBool(setString(key, value ? "1" : "0"), false);
}
/// get bool by index, returns defValue if no such key
override bool getBool(int index, bool defValue = false) {
return parseBool(getString(index, ""), defValue);
}
/// set bool for index, returns old value or false if not set
override bool setBool(int index, bool value) {
return parseBool(setString(index, value ? "1" : "0"), false);
}
/// get bool by key, returns defValue if no such key
int getInt(string key, int defValue = 0) {
override int getInt(string key, int defValue = 0) {
return parseInt(getString(key, ""), defValue);
}
/// set bool for key, returns old value or null if not set
int setInt(string key, int value) {
override int setInt(string key, int value) {
return parseInt(setString(key, to!string(value)), false);
}
/// get bool by index, returns defValue if no such key
override int getInt(int index, int defValue = 0) {
return parseInt(getString(index, ""), defValue);
}
/// set bool for index, returns old value or 0 if not set
override int setInt(int index, int value) {
return parseInt(setString(index, to!string(value)), false);
}
}