#ifndef EINA_JS_ARRAY_HH #define EINA_JS_ARRAY_HH #include #include #include namespace efl { namespace eina { namespace js { template struct eina_array : eina_container_common::value , efl::eina::eo_clone_allocator , efl::eina::malloc_clone_allocator >::type>, T, K> { typedef eina_container_common::value , efl::eina::eo_clone_allocator , efl::eina::malloc_clone_allocator >::type>, T, K> base_type; using base_type::base_type; typedef typename base_type::container_type container_type; eina_container_base* concat(eina_container_base const& other) const { return detail::concat(*this, other); } eina_container_base* slice(std::int64_t i, std::int64_t j) const { return detail::slice(*this, i, j); } v8::Local set(v8::Isolate* isolate, std::size_t index, v8::Local v) { return detail::set(isolate, *this, index, v); } int push(v8::Isolate* isolate, v8::Local v) { return detail::push(isolate, *this, v); } v8::Local pop(v8::Isolate* isolate) { return detail::pop(isolate, *this); } js::container_type get_container_type() const { return array_container_type; } }; template struct range_eina_array : eina_container_common, T, K> { typedef eina_container_common, T, K> base_type; using base_type::base_type; typedef typename base_type::container_type container_type; typedef typename std::conditional ::value , efl::eina::eo_clone_allocator , efl::eina::malloc_clone_allocator >::type clone_allocator_type; eina_container_base* concat(eina_container_base const& other) const { range_eina_array const& rhs = static_castconst&>(other); efl::eina::array array(this->_container.begin(), this->_container.end()); array.insert(array.end(), rhs._container.begin(), rhs._container.end()); return new eina_array(array.release_native_handle()); } eina_container_base* slice(std::int64_t i, std::int64_t j) const { efl::eina::array array(std::next(this->_container.begin(), i), std::next(this->_container.begin(), j)); return new eina_array(array.release_native_handle()); } js::container_type get_container_type() const { return array_container_type; } }; // Problematic types. template <> struct eina_array<_Elm_Calendar_Mark*, js::nonclass_cls_name_getter, _Elm_Calendar_Mark> : empty_container_base { eina_array(Eina_Array const*){} }; template <> struct eina_array : empty_container_base { eina_array(Eina_Array const*){} }; template <> struct eina_array<_Evas_Textblock_Rectangle*, js::nonclass_cls_name_getter, _Evas_Textblock_Rectangle> : empty_container_base { eina_array(Eina_Array const*){} }; template <> struct eina_array<_Elm_Map_Overlay*, js::nonclass_cls_name_getter, _Elm_Map_Overlay> : empty_container_base { eina_array(Eina_Array const*){} }; template <> struct range_eina_array<_Elm_Calendar_Mark*, js::nonclass_cls_name_getter, _Elm_Calendar_Mark> : empty_container_base { range_eina_array(Eina_Array const*){} }; template <> struct range_eina_array : empty_container_base { range_eina_array(Eina_Array const*){} }; template <> struct range_eina_array<_Evas_Textblock_Rectangle*, js::nonclass_cls_name_getter, _Evas_Textblock_Rectangle> : empty_container_base { range_eina_array(Eina_Array const*){} }; template <> struct range_eina_array<_Elm_Map_Overlay*, js::nonclass_cls_name_getter, _Elm_Map_Overlay> : empty_container_base { range_eina_array(Eina_Array const*){} }; } } } #endif