C++11 range loop support for XmlNode, ValueArray, Value #1264

git-svn-id: svn://ultimatepp.org/upp/trunk@8920 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
cxl 2015-09-13 19:01:52 +00:00
parent 555942682d
commit 02d258a434
6 changed files with 67 additions and 5 deletions

View file

@ -610,6 +610,26 @@ const Value& Value::operator[](int i) const
return ErrorValue();
}
const Vector<Value>& Value::GetVA() const
{
if(IsRef()) {
dword t = ptr()->GetType();
if(t == VALUEARRAY_V)
return ((ValueArray::Data *)ptr())->data;
}
return ValueArray::VoidData;
}
Value::ConstIterator Value::Begin() const
{
return GetVA().Begin();
}
Value::ConstIterator Value::End() const
{
return GetVA().End();
}
Vector<Value>& Value::CloneArray()
{
ValueArray::Data *data = (ValueArray::Data *)ptr();

View file

@ -178,6 +178,8 @@ protected:
Vector<Value>& CloneArray();
const Vector<Value>& GetVA() const;
#if defined(_DEBUG) && defined(COMPILER_GCC)
uint32 magic[4];
void Magic() { magic[0] = 0xc436d851; magic[1] = 0x72f67c76; magic[2] = 0x3e5e10fd; magic[3] = 0xc90d370b; }
@ -274,6 +276,18 @@ public:
const Void *GetVoidPtr() const { ASSERT(IsRef()); return ptr(); }
friend void Swap(Value& a, Value& b) { Swap(a.data, b.data); }
typedef Vector<Value>::ConstIterator ConstIterator;
ConstIterator Begin() const;
ConstIterator End() const;
typedef Value value_type;
typedef ConstIterator const_iterator;
typedef const Value& const_reference;
typedef int size_type;
typedef int difference_type;
const_iterator begin() const { return Begin(); }
const_iterator end() const { return End(); }
};
struct ValueTypeError : Exc {

View file

@ -112,6 +112,8 @@ String ValueArray::Data::AsString() const
return sAsString(data);
}
Vector<Value> ValueArray::VoidData;
Vector<Value>& ValueArray::Create()
{
data = new Data;

View file

@ -215,6 +215,8 @@ class ValueArray : public ValueType<ValueArray, VALUEARRAY_V, Moveable<ValueArra
struct NullData : Data {};
Data *data;
static Vector<Value> VoidData;
Vector<Value>& Create();
Vector<Value>& Clone();
void Init0();
@ -254,7 +256,7 @@ public:
void Set(int i, const Value& v);
const Value& Get(int i) const;
Value GetAndClear(int i);
const Vector<Value>& Get() const { return data->data; }
const Vector<Value>& Get() const { return data ? data->data : VoidData; }
Vector<Value> Pick();
void Remove(int i, int count = 1);
@ -280,6 +282,18 @@ public:
bool operator>=(const ValueArray& x) const { return Compare(x) >= 0; }
bool operator<(const ValueArray& x) const { return Compare(x) < 0; }
bool operator>(const ValueArray& x) const { return Compare(x) > 0; }
typedef Vector<Value>::ConstIterator ConstIterator;
ConstIterator Begin() const { return Get().Begin(); }
ConstIterator End() const { return Get().End(); }
typedef Value value_type;
typedef ConstIterator const_iterator;
typedef const Value& const_reference;
typedef int size_type;
typedef int difference_type;
const_iterator begin() const { return Begin(); }
const_iterator end() const { return End(); }
};
template<>

View file

@ -232,6 +232,18 @@ public:
XmlNode(const XmlNode& n, int);
XmlNode() { type = XML_DOC; }
typedef Array<XmlNode>::ConstIterator ConstIterator;
ConstIterator Begin() const { return node.Begin(); }
ConstIterator End() const { return node.End(); }
typedef XmlNode value_type;
typedef ConstIterator const_iterator;
typedef const XmlNode& const_reference;
typedef int size_type;
typedef int difference_type;
const_iterator begin() const { return Begin(); }
const_iterator end() const { return End(); }
};
enum {