From b4fa4e6f0c769778e3f127763fa3b7cfee8c7da8 Mon Sep 17 00:00:00 2001 From: Thomas Goyne Date: Mon, 17 Oct 2011 22:00:18 +0000 Subject: [PATCH] Expose all std::deque members in json::Array Originally committed to SVN as r5750. --- .../include/libaegisub/cajun/elements.h | 66 ++++++++----------- .../include/libaegisub/cajun/elements.inl | 24 +++---- 2 files changed, 41 insertions(+), 49 deletions(-) diff --git a/aegisub/libaegisub/include/libaegisub/cajun/elements.h b/aegisub/libaegisub/include/libaegisub/cajun/elements.h index 4579da4d2..e1162a01f 100644 --- a/aegisub/libaegisub/include/libaegisub/cajun/elements.h +++ b/aegisub/libaegisub/include/libaegisub/cajun/elements.h @@ -55,8 +55,6 @@ public: // element accesses can be chained together, allowing the following // (when document structure is well-known): // String str = objInvoices[1]["Customer"]["Company"]; - - class UnknownElement { public: @@ -132,46 +130,40 @@ private: Imp* m_pImp; }; - -///////////////////////////////////////////////////////////////////////////////// -// Array - mimics std::deque. The array contents are effectively -// heterogeneous thanks to the ElementUnknown class. -class Array +class Array : private std::deque { public: - typedef std::deque elements; - typedef elements::iterator iterator; - typedef elements::const_iterator const_iterator; + using std::deque::back; + using std::deque::begin; + using std::deque::clear; + using std::deque::const_iterator; + using std::deque::const_reference; + using std::deque::const_reverse_iterator; + using std::deque::difference_type; + using std::deque::empty; + using std::deque::end; + using std::deque::front; + using std::deque::iterator; + using std::deque::max_size; + using std::deque::pointer; + using std::deque::pop_back; + using std::deque::pop_front; + using std::deque::push_back; + using std::deque::push_front; + using std::deque::rbegin; + using std::deque::reference; + using std::deque::rend; + using std::deque::reverse_iterator; + using std::deque::size; + using std::deque::size_type; + using std::deque::swap; + using std::deque::value_type; - iterator begin() { return m_Elements.begin(); } - iterator end() { return m_Elements.end(); } - const_iterator begin() const { return m_Elements.begin(); } - const_iterator end() const { return m_Elements.end(); } - - iterator insert(iterator it, const UnknownElement& element) { m_Elements.insert(it, element); } - void push_back(const UnknownElement& element) { m_Elements.push_back(element); } - iterator erase(iterator it) { return m_Elements.erase(it); } - void resize(size_t newsize) { m_Elements.resize(newsize); } - void clear() { m_Elements.clear(); } - - size_t size() const { return m_Elements.size(); } - bool empty() const { return m_Elements.empty(); } - - UnknownElement& front() { return m_Elements.front(); } - const UnknownElement& front() const { return m_Elements.front(); } - UnknownElement& back() { return m_Elements.back(); } - const UnknownElement& back() const { return m_Elements.back(); } - - UnknownElement& operator[] (size_t index); - const UnknownElement& operator[] (size_t index) const; - - bool operator == (const Array& array) const { return m_Elements == array.m_Elements; } - -private: - elements m_Elements; + UnknownElement& operator[](size_t idx); + const UnknownElement& operator[](size_t idx) const; + bool operator==(Array const& rgt) const; }; - ///////////////////////////////////////////////////////////////////////////////// // Object - mimics std::map. The member value // contents are effectively heterogeneous thanks to the UnknownElement class diff --git a/aegisub/libaegisub/include/libaegisub/cajun/elements.inl b/aegisub/libaegisub/include/libaegisub/cajun/elements.inl index 78b2922d4..9825c6157 100644 --- a/aegisub/libaegisub/include/libaegisub/cajun/elements.inl +++ b/aegisub/libaegisub/include/libaegisub/cajun/elements.inl @@ -222,20 +222,20 @@ inline const UnknownElement& Object::operator [](const std::string& name) const ///////////////// // Array members - -inline UnknownElement& Array::operator[] (size_t index) -{ - size_t nMinsize = index + 1; // zero indexed - if (m_Elements.size() < nMinsize) - m_Elements.resize(nMinsize); - return m_Elements[index]; +inline UnknownElement& Array::operator[](size_t idx) { + if (idx >= size()) + resize(idx + 1); + return std::deque::operator[](idx); } -inline const UnknownElement& Array::operator[] (size_t index) const -{ - if (index >= m_Elements.size()) - throw Exception("Array out of bounds"); - return m_Elements[index]; +inline const UnknownElement& Array::operator[](size_t idx) const { + if (idx >= size()) + throw Exception("Array out of bounds"); + return std::deque::operator[](idx); +} + +inline bool Array::operator==(Array const& rgt) const { + return *static_cast *>(this) == rgt; } } // end namespace