From b0bdb345d1cce7c7c6896d0cc0b02cd5d88febba Mon Sep 17 00:00:00 2001 From: PraneethJain Date: Sat, 20 Jul 2024 22:15:41 +0530 Subject: [PATCH] feat: multiset and unordered multiset iterators --- include/jlcxx/stl.hpp | 35 ++++++++++++++++++++++++++++++++++ src/stl.cpp | 4 ++++ src/stl_multiset.cpp | 5 +++++ src/stl_unordered_multiset.cpp | 5 +++++ 4 files changed, 49 insertions(+) diff --git a/include/jlcxx/stl.hpp b/include/jlcxx/stl.hpp index f00932c..d2e3c8a 100644 --- a/include/jlcxx/stl.hpp +++ b/include/jlcxx/stl.hpp @@ -60,9 +60,11 @@ class JLCXX_API StlWrappers TypeWrapper1 stack; TypeWrapper1 set_iterator; TypeWrapper1 set; + TypeWrapper1 multiset_iterator; TypeWrapper1 multiset; TypeWrapper1 unordered_set_iterator; TypeWrapper1 unordered_set; + TypeWrapper1 unordered_multiset_iterator; TypeWrapper1 unordered_multiset; TypeWrapper1 list_iterator; TypeWrapper1 list; @@ -88,9 +90,11 @@ void apply_priority_queue(TypeWrapper1& priority_queue); void apply_stack(TypeWrapper1& stack); void apply_set_iterator(TypeWrapper1& set_iterator); void apply_set(TypeWrapper1& set); +void apply_multiset_iterator(TypeWrapper1& multiset_iterator); void apply_multiset(TypeWrapper1& multiset); void apply_unordered_set_iterator(TypeWrapper1& unordered_set_iterator); void apply_unordered_set(TypeWrapper1& unordered_set); +void apply_unordered_multiset_iterator(TypeWrapper1& unordered_multiset_iterator); void apply_unordered_multiset(TypeWrapper1& unordered_multiset); void apply_list_iterator(TypeWrapper1& list_iterator); void apply_list(TypeWrapper1& list); @@ -426,6 +430,18 @@ struct WrapUnorderedSet } }; +template +struct MultisetIteratorWrapper +{ + using value_type = valueT; + using iterator_type = typename std::multiset< + valueT, + std::less, + std::allocator + >::iterator; + iterator_type value; +}; + struct WrapMultiset { template @@ -443,10 +459,25 @@ struct WrapMultiset 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.method("iteratorbegin", [] (WrappedT& v) { return MultisetIteratorWrapper{v.begin()}; }); + wrapped.method("iteratorend", [] (WrappedT& v) { return MultisetIteratorWrapper{v.end()}; }); wrapped.module().unset_override_module(); } }; +template +struct UnorderedMultisetIteratorWrapper +{ + using value_type = valueT; + using iterator_type = typename std::unordered_multiset< + valueT, + std::hash, + std::equal_to, + std::allocator + >::iterator; + iterator_type value; +}; + struct WrapUnorderedMultiset { template @@ -464,6 +495,8 @@ struct WrapUnorderedMultiset 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.method("iteratorbegin", [] (WrappedT& v) { return UnorderedMultisetIteratorWrapper{v.begin()}; }); + wrapped.method("iteratorend", [] (WrappedT& v) { return UnorderedMultisetIteratorWrapper{v.end()}; }); wrapped.module().unset_override_module(); } }; @@ -583,6 +616,7 @@ inline void apply_stl(jlcxx::Module& mod) { TypeWrapper1(mod, StlWrappers::instance().set_iterator).apply>(WrapIterator()); TypeWrapper1(mod, StlWrappers::instance().set).apply>(WrapSet()); + TypeWrapper1(mod, StlWrappers::instance().multiset_iterator).apply>(WrapIterator()); TypeWrapper1(mod, StlWrappers::instance().multiset).apply>(WrapMultiset()); TypeWrapper1(mod, StlWrappers::instance().priority_queue).apply>(WrapPriorityQueue()); } @@ -590,6 +624,7 @@ inline void apply_stl(jlcxx::Module& mod) { TypeWrapper1(mod, StlWrappers::instance().unordered_set_iterator).apply>(WrapIterator()); TypeWrapper1(mod, StlWrappers::instance().unordered_set).apply>(WrapUnorderedSet()); + TypeWrapper1(mod, StlWrappers::instance().unordered_multiset_iterator).apply>(WrapIterator()); TypeWrapper1(mod, StlWrappers::instance().unordered_multiset).apply>(WrapUnorderedMultiset()); } TypeWrapper1(mod, StlWrappers::instance().list_iterator).apply>(WrapIterator()); diff --git a/src/stl.cpp b/src/stl.cpp index 1cb8bc3..5028e53 100644 --- a/src/stl.cpp +++ b/src/stl.cpp @@ -26,9 +26,11 @@ JLCXX_API void StlWrappers::instantiate(Module& mod) apply_stack(m_instance->stack); apply_set_iterator(m_instance->set_iterator); apply_set(m_instance->set); + apply_multiset_iterator(m_instance->multiset_iterator); apply_multiset(m_instance->multiset); apply_unordered_set_iterator(m_instance->unordered_set_iterator); apply_unordered_set(m_instance->unordered_set); + apply_unordered_multiset_iterator(m_instance->unordered_multiset_iterator); apply_unordered_multiset(m_instance->unordered_multiset); apply_list_iterator(m_instance->list_iterator); apply_list(m_instance->list); @@ -65,9 +67,11 @@ JLCXX_API StlWrappers::StlWrappers(Module& stl) : stack(stl.add_type>>("StdStack")), set_iterator(stl.add_type>>("StdSetIterator")), set(stl.add_type>>("StdSet")), + multiset_iterator(stl.add_type>>("StdMultisetIterator")), multiset(stl.add_type>>("StdMultiset")), unordered_set_iterator(stl.add_type>>("StdUnorderedSetIterator")), unordered_set(stl.add_type>>("StdUnorderedSet")), + unordered_multiset_iterator(stl.add_type>>("StdUnorderedMultisetIterator")), unordered_multiset(stl.add_type>>("StdUnorderedMultiset")), list_iterator(stl.add_type>>("StdListIterator")), list(stl.add_type>>("StdList")), diff --git a/src/stl_multiset.cpp b/src/stl_multiset.cpp index 3983131..dd8e599 100644 --- a/src/stl_multiset.cpp +++ b/src/stl_multiset.cpp @@ -6,6 +6,11 @@ namespace jlcxx namespace stl { +void apply_multiset_iterator(TypeWrapper1& multiset_iterator) +{ + multiset_iterator.apply_combination(stl::WrapIterator()); +} + void apply_multiset(TypeWrapper1& multiset) { multiset.apply_combination(stl::WrapMultiset()); diff --git a/src/stl_unordered_multiset.cpp b/src/stl_unordered_multiset.cpp index 7b2bc7c..abf74a7 100644 --- a/src/stl_unordered_multiset.cpp +++ b/src/stl_unordered_multiset.cpp @@ -6,6 +6,11 @@ namespace jlcxx namespace stl { +void apply_unordered_multiset_iterator(TypeWrapper1& unordered_multiset_iterator) +{ + unordered_multiset_iterator.apply_combination(stl::WrapIterator()); +} + void apply_unordered_multiset(TypeWrapper1& unordered_multiset) { unordered_multiset.apply_combination(stl::WrapUnorderedMultiset());