|
1 | 1 | #ifndef JLCXX_STL_HPP |
2 | 2 | #define JLCXX_STL_HPP |
3 | 3 |
|
| 4 | +#include <valarray> |
4 | 5 | #include <vector> |
5 | 6 |
|
6 | 7 | #include "module.hpp" |
@@ -43,6 +44,7 @@ class JLCXX_API StlWrappers |
43 | 44 | Module& m_stl_mod; |
44 | 45 | public: |
45 | 46 | TypeWrapper1 vector; |
| 47 | + TypeWrapper1 valarray; |
46 | 48 |
|
47 | 49 | static void instantiate(Module& mod); |
48 | 50 | static StlWrappers& instance(); |
@@ -134,10 +136,31 @@ struct WrapVector |
134 | 136 | } |
135 | 137 | }; |
136 | 138 |
|
| 139 | +struct WrapValArray |
| 140 | +{ |
| 141 | + template<typename TypeWrapperT> |
| 142 | + void operator()(TypeWrapperT&& wrapped) |
| 143 | + { |
| 144 | + using WrappedT = typename TypeWrapperT::type; |
| 145 | + using T = typename WrappedT::value_type; |
| 146 | + wrapped.template constructor<std::size_t>(); |
| 147 | + wrapped.template constructor<const T&, std::size_t>(); |
| 148 | + wrapped.template constructor<const T*, std::size_t>(); |
| 149 | + wrapped.module().set_override_module(StlWrappers::instance().module()); |
| 150 | + wrapped.method("cppsize", &WrappedT::size); |
| 151 | + wrapped.method("resize", [] (WrappedT& v, const cxxint_t s) { v.resize(s); }); |
| 152 | + wrapped.method("cxxgetindex", [] (const WrappedT& v, cxxint_t i) -> const T& { return v[i-1]; }); |
| 153 | + wrapped.method("cxxgetindex", [] (WrappedT& v, cxxint_t i) -> T& { return v[i-1]; }); |
| 154 | + wrapped.method("cxxsetindex!", [] (WrappedT& v, const T& val, cxxint_t i) { v[i-1] = val; }); |
| 155 | + wrapped.module().unset_override_module(); |
| 156 | + } |
| 157 | +}; |
| 158 | + |
137 | 159 | template<typename T> |
138 | 160 | inline void apply_stl(jlcxx::Module& mod) |
139 | 161 | { |
140 | 162 | TypeWrapper1(mod, StlWrappers::instance().vector).apply<std::vector<T>>(WrapVector()); |
| 163 | + TypeWrapper1(mod, StlWrappers::instance().valarray).apply<std::valarray<T>>(WrapValArray()); |
141 | 164 | } |
142 | 165 |
|
143 | 166 | } |
|
0 commit comments