diff --git a/include/jlcxx/stl.hpp b/include/jlcxx/stl.hpp index 4a8bbb9..1474057 100644 --- a/include/jlcxx/stl.hpp +++ b/include/jlcxx/stl.hpp @@ -52,6 +52,7 @@ class JLCXX_API StlWrappers TypeWrapper1 deque; TypeWrapper1 queue; TypeWrapper1 set; + TypeWrapper1 multiset; static void instantiate(Module& mod); static StlWrappers& instance(); @@ -257,6 +258,27 @@ struct WrapSet } }; +struct WrapMultiset +{ + template + void operator()(TypeWrapperT&& wrapped) + { + using WrappedT = typename TypeWrapperT::type; + using T = typename WrappedT::value_type; + + wrapped.template constructor<>(); + wrapped.module().set_override_module(StlWrappers::instance().module()); + wrapped.method("cppsize", &WrappedT::size); + wrapped.method("multiset_insert!", [] (WrappedT& v, const T& val) { v.insert(val); }); + wrapped.method("multiset_empty!", [] (WrappedT& v) { v.clear(); }); + wrapped.method("multiset_isempty", [] (WrappedT& v) { return v.empty(); }); + wrapped.method("multiset_delete!", [] (WrappedT&v, const T& val) { v.erase(val); }); + wrapped.method("multiset_in", [] (WrappedT& v, const T& val) { return v.count(val) != 0; }); + wrapped.method("multiset_count", [] (WrappedT& v, const T& val) { return v.count(val); }); + wrapped.module().unset_override_module(); + } +}; + template struct has_less_than_operator : std::false_type {}; @@ -298,6 +320,7 @@ inline void apply_stl(jlcxx::Module& mod) if constexpr (container_has_less_than_operator::value) { TypeWrapper1(mod, StlWrappers::instance().set).apply>(WrapSet()); + TypeWrapper1(mod, StlWrappers::instance().multiset).apply>(WrapMultiset()); } } diff --git a/src/stl.cpp b/src/stl.cpp index 4d4eb18..650898f 100644 --- a/src/stl.cpp +++ b/src/stl.cpp @@ -22,6 +22,7 @@ JLCXX_API void StlWrappers::instantiate(Module& mod) m_instance->deque.apply_combination(stl::WrapDeque()); m_instance->queue.apply_combination(stl::WrapQueue()); m_instance->set.apply_combination(stl::WrapSet()); + m_instance->multiset.apply_combination(stl::WrapMultiset()); smartptr::apply_smart_combination(); smartptr::apply_smart_combination(); smartptr::apply_smart_combination(); @@ -47,7 +48,8 @@ JLCXX_API StlWrappers::StlWrappers(Module& stl) : valarray(stl.add_type>>("StdValArray", julia_type("AbstractVector"))), deque(stl.add_type>>("StdDeque", julia_type("AbstractVector"))), queue(stl.add_type>>("StdQueue", julia_type("AbstractVector"))), - set(stl.add_type>>("StdSet")) + set(stl.add_type>>("StdSet")), + multiset(stl.add_type>>("StdMultiset")) { }