From e256a92eb1a6b4ca927e1a52a2850ad8b39bd18c Mon Sep 17 00:00:00 2001 From: Felipe Magno de Almeida Date: Thu, 17 Jul 2014 15:29:16 -0300 Subject: [PATCH] eina-cxx: Added range_list to range types for eina-cxx Added range_list which abstracts a ptr_list for wrapper types. --- src/bindings/eina_cxx/eina_list.hh | 260 +++++++++++++++- src/bindings/eina_cxx/eina_ptrlist.hh | 352 +++++++--------------- src/bindings/eina_cxx/eina_range_types.hh | 1 + 3 files changed, 358 insertions(+), 255 deletions(-) diff --git a/src/bindings/eina_cxx/eina_list.hh b/src/bindings/eina_cxx/eina_list.hh index dbdfea98c0..ec54f42260 100644 --- a/src/bindings/eina_cxx/eina_list.hh +++ b/src/bindings/eina_cxx/eina_list.hh @@ -73,6 +73,100 @@ struct _ptr_eo_list_iterator : _ptr_list_iterator using _base_type::native_handle; }; +/** + * @internal + */ +struct _eo_list_access_traits : _ptr_list_access_traits +{ + template + struct iterator + { + typedef _ptr_eo_list_iterator type; + }; + template + struct const_iterator : iterator {}; + template + static T& back(Eina_List* list) + { + return *static_cast(static_cast(&eina_list_last(list)->data)); + } + template + static T const& back(Eina_List const* list) + { + return _eo_list_access_traits::back(const_cast(list)); + } + template + static T& front(Eina_List* list) + { + return *static_cast(static_cast(&list->data)); + } + template + static T const& front(Eina_List const* list) + { + return _eo_list_access_traits::front(const_cast(list)); + } + template + static typename iterator::type begin(Eina_List* list) + { + return typename iterator::type(list, list); + } + template + static typename iterator::type end(Eina_List* list) + { + return typename iterator::type(list, nullptr); + } + template + static typename const_iterator::type begin(Eina_List const* list) + { + return _eo_list_access_traits::begin(const_cast(list)); + } + template + static typename const_iterator::type end(Eina_List const* list) + { + return _eo_list_access_traits::end(const_cast(list)); + } + template + static std::reverse_iterator::type> rbegin(Eina_List* list) + { + return std::reverse_iterator::type>(_eo_list_access_traits::end(list)); + } + template + static std::reverse_iterator::type> rend(Eina_List* list) + { + return std::reverse_iterator::type>(_eo_list_access_traits::begin(list)); + } + template + static std::reverse_iterator::type> rbegin(Eina_List const* list) + { + return _eo_list_access_traits::rbegin(const_cast(list)); + } + template + static std::reverse_iterator::type> rend(Eina_List const* list) + { + return _eo_list_access_traits::rend(const_cast(list)); + } + template + static typename const_iterator::type cbegin(Eina_List const* list) + { + return _eo_list_access_traits::begin(list); + } + template + static typename const_iterator::type cend(Eina_List const* list) + { + return _eo_list_access_traits::end(list); + } + template + static std::reverse_iterator::type> crbegin(Eina_List const* list) + { + return _eo_list_access_traits::rbegin(list); + } + template + static std::reverse_iterator::type> crend(Eina_List const* list) + { + return _eo_list_access_traits::rend(list); + } +}; + template class list : ptr_list::value @@ -253,21 +347,21 @@ public: reference front() { - return *static_cast(static_cast(&native_handle()->data)); + return _eo_list_access_traits::front(native_handle()); } reference back() { - return *static_cast(static_cast(&eina_list_last(native_handle())->data)); + return _eo_list_access_traits::back(native_handle()); } const_reference front() const { return const_cast<_self_type*>(this)->front(); } const_reference back() const { return const_cast<_self_type*>(this)->back(); } iterator begin() { - return iterator(native_handle(), native_handle()); + return _eo_list_access_traits::begin(native_handle()); } iterator end() { - return iterator(native_handle(), nullptr); + return _eo_list_access_traits::end(native_handle()); } const_iterator begin() const { @@ -287,11 +381,11 @@ public: } reverse_iterator rbegin() { - return reverse_iterator(end()); + return _eo_list_access_traits::rbegin(native_handle()); } reverse_iterator rend() { - return reverse_iterator(begin()); + return _eo_list_access_traits::rend(native_handle()); } const_reverse_iterator rbegin() const { @@ -324,6 +418,160 @@ bool operator!=(list const& rhs, list cons { return !(rhs == lhs); } + +template +class range_list : range_ptr_list +{ + typedef range_ptr_list _base_type; +public: + typedef typename _base_type::value_type value_type; + typedef typename _base_type::reference reference; + typedef typename _base_type::const_reference const_reference; + typedef typename _base_type::const_iterator const_iterator; + typedef typename _base_type::iterator iterator; + typedef typename _base_type::pointer pointer; + typedef typename _base_type::const_pointer const_pointer; + typedef typename _base_type::size_type size_type; + typedef typename _base_type::difference_type difference_type; + typedef typename _base_type::clone_allocator_type clone_allocator_type; + + typedef typename _base_type::reverse_iterator reverse_iterator; + typedef typename _base_type::const_reverse_iterator const_reverse_iterator; + + using _base_type::_base_type; + using _base_type::clear; + using _base_type::size; + using _base_type::empty; + using _base_type::get_clone_allocator; + using _base_type::push_back; + using _base_type::push_front; + using _base_type::pop_back; + using _base_type::pop_front; + using _base_type::insert; + using _base_type::erase; + using _base_type::assign; + using _base_type::back; + using _base_type::front; + using _base_type::begin; + using _base_type::end; + using _base_type::rbegin; + using _base_type::rend; + using _base_type::cbegin; + using _base_type::cend; + using _base_type::crbegin; + using _base_type::crend; + using _base_type::ibegin; + using _base_type::iend; + using _base_type::cibegin; + using _base_type::ciend; + using _base_type::swap; + using _base_type::max_size; + using _base_type::native_handle; + using _base_type::accessor; +}; + +template +class range_list::value>::type> + : range_ptr_list +{ + typedef range_ptr_list _base_type; + typedef range_list _self_type; +public: + typedef T value_type; + typedef value_type& reference; + typedef value_type const& const_reference; + typedef _ptr_eo_list_iterator const_iterator; + typedef _ptr_eo_list_iterator iterator; + typedef value_type* pointer; + typedef value_type const* const_pointer; + typedef std::size_t size_type; + typedef std::ptrdiff_t difference_type; + + typedef std::reverse_iterator reverse_iterator; + typedef std::reverse_iterator const_reverse_iterator; + + explicit range_list(Eina_List* handle) + : _base_type(handle) {} + range_list() {} + range_list(range_list const& other) + : _base_type(other.native_handle()) + { + } + range_list& operator=(range_listconst& other) + { + _base_type::_handle = other._handle; + return *this; + } + + using _base_type::size; + using _base_type::empty; + + reference front() + { + return _eo_list_access_traits::front(native_handle()); + } + reference back() + { + return _eo_list_access_traits::back(native_handle()); + } + const_reference front() const { return const_cast<_self_type*>(this)->front(); } + const_reference back() const { return const_cast<_self_type*>(this)->back(); } + iterator begin() + { + return _eo_list_access_traits::begin(native_handle()); + } + iterator end() + { + return _eo_list_access_traits::end(native_handle()); + } + const_iterator begin() const + { + return const_cast<_self_type*>(this)->begin(); + } + const_iterator end() const + { + return const_cast<_self_type*>(this)->end(); + } + const_iterator cbegin() const + { + return begin(); + } + const_iterator cend() const + { + return end(); + } + reverse_iterator rbegin() + { + return _eo_list_access_traits::rbegin(native_handle()); + } + reverse_iterator rend() + { + return _eo_list_access_traits::rend(native_handle()); + } + const_reverse_iterator rbegin() const + { + return const_cast<_self_type*>(this)->rbegin(); + } + const_reverse_iterator rend() const + { + return const_cast<_self_type*>(this)->rend(); + } + const_reverse_iterator crbegin() const + { + return rbegin(); + } + const_reverse_iterator crend() const + { + return rend(); + } + using _base_type::swap; + using _base_type::native_handle; + + friend bool operator==(range_list const& rhs, range_list const& lhs) + { + return rhs.size() == lhs.size() && std::equal(rhs.begin(), rhs.end(), lhs.begin()); + } +}; } } diff --git a/src/bindings/eina_cxx/eina_ptrlist.hh b/src/bindings/eina_cxx/eina_ptrlist.hh index 1cddce0f35..140c5cea15 100644 --- a/src/bindings/eina_cxx/eina_ptrlist.hh +++ b/src/bindings/eina_cxx/eina_ptrlist.hh @@ -120,295 +120,149 @@ struct _ptr_list_iterator : _ptr_list_iterator_base /** * @internal */ -struct _ptr_list_access_traits { - -template -struct iterator +struct _ptr_list_access_traits { - typedef _ptr_list_iterator type; -}; -template -struct const_iterator : iterator {}; -template -struct native_handle -{ - typedef Eina_List* type; -}; -template -struct const_native_handle -{ - typedef Eina_List const* type; -}; -template -static Eina_List* native_handle_from_const(Eina_List const* list) -{ - return const_cast(list); -} -template -static T& back(Eina_List* list) -{ - return *static_cast(eina_list_data_get(eina_list_last(list))); -} -template -static T const& back(Eina_List const* list) -{ - return _ptr_list_access_traits::back(const_cast(list)); -} -template -static T& front(Eina_List* list) -{ - return *static_cast(eina_list_data_get(list)); -} -template -static T const& front(Eina_List const* list) -{ - return _ptr_list_access_traits::front(const_cast(list)); -} -template -static _ptr_list_iterator begin(Eina_List* list) -{ - return _ptr_list_iterator(list, list); -} -template -static _ptr_list_iterator end(Eina_List* list) -{ - return _ptr_list_iterator(list, 0); -} -template -static _ptr_list_iterator begin(Eina_List const* list) -{ - return _ptr_list_access_traits::begin(const_cast(list)); -} -template -static _ptr_list_iterator end(Eina_List const* list) -{ - return _ptr_list_access_traits::end(const_cast(list)); -} -template -static std::reverse_iterator<_ptr_list_iterator > rbegin(Eina_List* list) -{ - return std::reverse_iterator<_ptr_list_iterator >(_ptr_list_access_traits::end(list)); -} -template -static std::reverse_iterator<_ptr_list_iterator > rend(Eina_List* list) -{ - return std::reverse_iterator<_ptr_list_iterator >(_ptr_list_access_traits::begin(list)); -} -template -static std::reverse_iterator<_ptr_list_iterator > rbegin(Eina_List const* list) -{ - return _ptr_list_access_traits::rbegin(const_cast(list)); -} -template -static std::reverse_iterator<_ptr_list_iterator > rend(Eina_List const* list) -{ - return _ptr_list_access_traits::rend(const_cast(list)); -} -template -static _ptr_list_iterator cbegin(Eina_List const* list) -{ - return _ptr_list_access_traits::begin(list); -} -template -static _ptr_list_iterator cend(Eina_List const* list) -{ - return _ptr_list_access_traits::end(list); -} -template -static std::reverse_iterator<_ptr_list_iterator > crbegin(Eina_List const* list) -{ - return _ptr_list_access_traits::rbegin(list); -} -template -static std::reverse_iterator<_ptr_list_iterator > crend(Eina_List const* list) -{ - return _ptr_list_access_traits::rend(list); -} -template -static eina::iterator ibegin(Eina_List* list) -{ - return eina::iterator( ::eina_list_iterator_new(list) ); -} -template -static eina::iterator iend(Eina_List*) -{ - return eina::iterator(); -} -template -static eina::iterator ibegin(Eina_List const* list) -{ - return eina::iterator( ::eina_list_iterator_new(list) ); -} -template -static eina::iterator iend(Eina_List const*) -{ - return eina::iterator(); -} -template -static eina::iterator cibegin(Eina_List const* list) -{ - return _ptr_list_access_traits::ibegin(list); -} -template -static eina::iterator ciend(Eina_List const* list) -{ - return _ptr_list_access_traits::iend(list); -} -template -static std::size_t size(Eina_List const* list) -{ - return eina_list_count(list); -} -template -static bool empty(Eina_List const* list) -{ - return _ptr_list_access_traits::size(list) == 0u; -} - -}; - -/** - * @internal - */ -template -struct _const_range_ptr_list -{ - typedef _ptr_list_iterator const_iterator; - typedef const_iterator iterator; - typedef T value_type; - typedef T& reference; - typedef T const& const_reference; - typedef T* pointer; - typedef T const* const_pointer; - typedef std::reverse_iterator const_reverse_iterator; - typedef const_reverse_iterator reverse_iterator; - typedef std::size_t size_type; - typedef std::ptrdiff_t difference_type; - - typedef Eina_List const* native_handle_type; - typedef _const_range_ptr_list _self_type; - - _const_range_ptr_list(native_handle_type list) - : _list(list) {} - - native_handle_type native_handle() const { return _list; } - value_type const& back() const + template + struct iterator { - return _ptr_list_access_traits::back(_list); + typedef _ptr_list_iterator type; + }; + template + struct const_iterator : iterator {}; + template + struct native_handle + { + typedef Eina_List* type; + }; + template + struct const_native_handle + { + typedef Eina_List const* type; + }; + template + static Eina_List* native_handle_from_const(Eina_List const* list) + { + return const_cast(list); } - value_type const& front() const + template + static T& back(Eina_List* list) { - return _ptr_list_access_traits::front(_list); + return *static_cast(eina_list_data_get(eina_list_last(list))); } - const_iterator begin() const + template + static T const& back(Eina_List const* list) { - return _ptr_list_access_traits::begin(_list); + return _ptr_list_access_traits::back(const_cast(list)); } - const_iterator end() const + template + static T& front(Eina_List* list) { - return _ptr_list_access_traits::end(_list); + return *static_cast(eina_list_data_get(list)); } - const_reverse_iterator rbegin() const + template + static T const& front(Eina_List const* list) { - return _ptr_list_access_traits::rbegin(_list); + return _ptr_list_access_traits::front(const_cast(list)); } - const_reverse_iterator rend() const + template + static _ptr_list_iterator begin(Eina_List* list) { - return _ptr_list_access_traits::rend(_list); + return _ptr_list_iterator(list, list); } - const_iterator cbegin() const + template + static _ptr_list_iterator end(Eina_List* list) { - return _ptr_list_access_traits::cbegin(_list); + return _ptr_list_iterator(list, 0); } - const_iterator cend() const + template + static _ptr_list_iterator begin(Eina_List const* list) { - return _ptr_list_access_traits::cend(_list); + return _ptr_list_access_traits::begin(const_cast(list)); } - const_reverse_iterator crbegin() const + template + static _ptr_list_iterator end(Eina_List const* list) { - return _ptr_list_access_traits::crbegin(_list); + return _ptr_list_access_traits::end(const_cast(list)); } - const_reverse_iterator crend() const + template + static std::reverse_iterator<_ptr_list_iterator > rbegin(Eina_List* list) { - return _ptr_list_access_traits::crend(_list); + return std::reverse_iterator<_ptr_list_iterator >(_ptr_list_access_traits::end(list)); } - void swap(_self_type& other) + template + static std::reverse_iterator<_ptr_list_iterator > rend(Eina_List* list) { - std::swap(_list, other._list); + return std::reverse_iterator<_ptr_list_iterator >(_ptr_list_access_traits::begin(list)); } - bool empty() const + template + static std::reverse_iterator<_ptr_list_iterator > rbegin(Eina_List const* list) { - return _ptr_list_access_traits::empty(_list); + return _ptr_list_access_traits::rbegin(const_cast(list)); } - size_type size() const + template + static std::reverse_iterator<_ptr_list_iterator > rend(Eina_List const* list) { - return _ptr_list_access_traits::size(_list); + return _ptr_list_access_traits::rend(const_cast(list)); } - - native_handle_type _list; -}; - -/** - * @internal - */ -template -void swap(_const_range_ptr_list& lhs, _const_range_ptr_list& rhs) -{ - lhs.swap(rhs); -} - -/** - * @internal - */ -template -struct _mutable_range_ptr_list : _const_range_ptr_list -{ - typedef _const_range_ptr_list _base_type; - typedef T value_type; - typedef _ptr_list_iterator iterator; - typedef T& reference; - typedef T* pointer; - typedef std::reverse_iterator reverse_iterator; - typedef typename _base_type::const_iterator const_iterator; - typedef typename _base_type::const_reference const_reference; - typedef typename _base_type::const_pointer const_pointer; - typedef typename _base_type::const_reverse_iterator const_reverse_iterator; - typedef std::size_t size_type; - typedef std::ptrdiff_t difference_type; - - typedef Eina_List* native_handle_type; - typedef _mutable_range_ptr_list _self_type; - - _mutable_range_ptr_list(native_handle_type list) - : _base_type(list) {} - - native_handle_type native_handle() const + template + static _ptr_list_iterator cbegin(Eina_List const* list) { - return const_cast(_base_type::native_handle()); + return _ptr_list_access_traits::begin(list); } - value_type& back() const + template + static _ptr_list_iterator cend(Eina_List const* list) { - return _ptr_list_access_traits::back(native_handle()); + return _ptr_list_access_traits::end(list); } - value_type& front() const + template + static std::reverse_iterator<_ptr_list_iterator > crbegin(Eina_List const* list) { - return _ptr_list_access_traits::front(native_handle()); + return _ptr_list_access_traits::rbegin(list); } - iterator begin() const + template + static std::reverse_iterator<_ptr_list_iterator > crend(Eina_List const* list) { - return _ptr_list_access_traits::begin(native_handle()); + return _ptr_list_access_traits::rend(list); } - iterator end() const + template + static eina::iterator ibegin(Eina_List* list) { - return _ptr_list_access_traits::end(native_handle()); + return eina::iterator( ::eina_list_iterator_new(list) ); } - reverse_iterator rbegin() const + template + static eina::iterator iend(Eina_List*) { - return _ptr_list_access_traits::rbegin(native_handle()); + return eina::iterator(); } - reverse_iterator rend() const + template + static eina::iterator ibegin(Eina_List const* list) { - return _ptr_list_access_traits::rend(native_handle()); + return eina::iterator( ::eina_list_iterator_new(list) ); + } + template + static eina::iterator iend(Eina_List const*) + { + return eina::iterator(); + } + template + static eina::iterator cibegin(Eina_List const* list) + { + return _ptr_list_access_traits::ibegin(list); + } + template + static eina::iterator ciend(Eina_List const* list) + { + return _ptr_list_access_traits::iend(list); + } + template + static std::size_t size(Eina_List const* list) + { + return eina_list_count(list); + } + template + static bool empty(Eina_List const* list) + { + return _ptr_list_access_traits::size(list) == 0u; } }; diff --git a/src/bindings/eina_cxx/eina_range_types.hh b/src/bindings/eina_cxx/eina_range_types.hh index 8216adeb7f..4c60221390 100644 --- a/src/bindings/eina_cxx/eina_range_types.hh +++ b/src/bindings/eina_cxx/eina_range_types.hh @@ -389,6 +389,7 @@ struct _range_template : private std::conditional using _base_type::crend; using _base_type::empty; using _base_type::size; + using _base_type::swap; protected: using _base_type::_handle; };