summaryrefslogtreecommitdiff
path: root/src/bindings/eina_js/eina_js_list.hh
blob: 6ab05218476aad6ae1d85bb31504525bcecbf59c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#ifndef EINA_JS_LIST_HH
#define EINA_JS_LIST_HH

#include <iostream>

#include <eina_js_container.hh>
#include <eina_js_compatibility.hh>

#include <iterator>

namespace efl { namespace eina { namespace js {

template <typename T, typename K, typename W>
struct eina_list : eina_container_common<efl::eina::list
                                    <W
                                    , typename std::conditional
                                      <std::is_base_of<efl::eo::concrete, W>::value
                                       , efl::eina::eo_clone_allocator
                                       , efl::eina::malloc_clone_allocator
                                       >::type>, T, K>
{
  typedef eina_container_common<efl::eina::list<W
                           , typename std::conditional
                           <std::is_base_of<efl::eo::concrete, W>::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<v8::Value> set(v8::Isolate* isolate, std::size_t index, v8::Local<v8::Value> v)
  {
    return detail::set<T,W>(isolate, *this, index, v);
  }
  int push(v8::Isolate* isolate, v8::Local<v8::Value> v)
  {
    return detail::push<T,W>(isolate, *this, v);
  }
  v8::Local<v8::Value> pop(v8::Isolate* isolate)
  {
    return detail::pop<T,W,K>(isolate, *this);
  }
  js::container_type get_container_type() const { return list_container_type; }
};

template <typename T, typename K, typename W>
struct range_eina_list : eina_container_common<typename efl::eina::range_list<W>, T, K>
{
  typedef eina_container_common<efl::eina::range_list<W>, T, K> base_type;
  using base_type::base_type;
  typedef typename base_type::container_type container_type;
  typedef typename std::conditional
    <std::is_base_of<efl::eo::concrete, W>::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_list<T, K, W>const& rhs = static_cast<range_eina_list<T, K, W>const&>(other);
    efl::eina::list<W, clone_allocator_type>
      list(this->_container.begin(), this->_container.end());
    list.insert(list.end(), rhs._container.begin(), rhs._container.end());
    return new eina::js::eina_list<T, K, W>(list.release_native_handle());
  }
  eina_container_base* slice(std::int64_t i, std::int64_t j) const
  {
    efl::eina::list<W, clone_allocator_type>
      list(std::next(this->_container.begin(), i), std::next(this->_container.begin(), j));
    return new eina::js::eina_list<T, K, W>(list.release_native_handle());
  }
  v8::Local<v8::Value> set(v8::Isolate* isolate, std::size_t, v8::Local<v8::Value>)
  {
    return v8::Undefined(isolate);
  }
  int push(v8::Isolate*, v8::Local<v8::Value>)
  {
    return this->size();
  }
  v8::Local<v8::Value> pop(v8::Isolate* isolate)
  {
    return v8::Undefined(isolate);
  }
  js::container_type get_container_type() const { return list_container_type; }
};

// Problematic types.
template <>
struct eina_list<_Elm_Calendar_Mark*, js::nonclass_cls_name_getter, _Elm_Calendar_Mark>
  : empty_container_base
{ eina_list(Eina_List const*){} };
template <>
struct eina_list<Elm_Gen_Item*, js::nonclass_cls_name_getter, Elm_Gen_Item>
  : empty_container_base
{ eina_list(Eina_List const*){} };
template <>
struct eina_list<_Evas_Textblock_Rectangle*, js::nonclass_cls_name_getter, _Evas_Textblock_Rectangle>
  : empty_container_base
{ eina_list(Eina_List const*){} };
template <>
struct eina_list<_Elm_Map_Overlay*, js::nonclass_cls_name_getter, _Elm_Map_Overlay>
  : empty_container_base
{ eina_list(Eina_List const*){} };

template <>
struct range_eina_list<_Elm_Calendar_Mark*, js::nonclass_cls_name_getter, _Elm_Calendar_Mark>
  : empty_container_base
{ range_eina_list(Eina_List const*){} };
template <>
struct range_eina_list<Elm_Gen_Item*, js::nonclass_cls_name_getter, Elm_Gen_Item>
  : empty_container_base
{ range_eina_list(Eina_List const*){} };
template <>
struct range_eina_list<_Evas_Textblock_Rectangle*, js::nonclass_cls_name_getter, _Evas_Textblock_Rectangle>
  : empty_container_base
{ range_eina_list(Eina_List const*){} };
template <>
struct range_eina_list<_Elm_Map_Overlay*, js::nonclass_cls_name_getter, _Elm_Map_Overlay>
  : empty_container_base
{ range_eina_list(Eina_List const*){} };

} } }

#endif