diff --git a/CMakeLists.txt b/CMakeLists.txt index a3b74b2..4e4d6eb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -100,6 +100,8 @@ set(JLCXX_STL_SOURCES ${JLCXX_SOURCE_DIR}/stl_queue.cpp ${JLCXX_SOURCE_DIR}/stl_set.cpp ${JLCXX_SOURCE_DIR}/stl_multiset.cpp + ${JLCXX_SOURCE_DIR}/stl_unordered_set.cpp + ${JLCXX_SOURCE_DIR}/stl_unordered_multiset.cpp ${JLCXX_SOURCE_DIR}/stl_shared_ptr.cpp ${JLCXX_SOURCE_DIR}/stl_unique_ptr.cpp ${JLCXX_SOURCE_DIR}/stl_weak_ptr.cpp diff --git a/include/jlcxx/stl.hpp b/include/jlcxx/stl.hpp index a406495..62d11c9 100644 --- a/include/jlcxx/stl.hpp +++ b/include/jlcxx/stl.hpp @@ -7,6 +7,7 @@ #include #include #include +#include #include "module.hpp" #include "smart_pointers.hpp" @@ -53,6 +54,8 @@ class JLCXX_API StlWrappers TypeWrapper1 queue; TypeWrapper1 set; TypeWrapper1 multiset; + TypeWrapper1 unordered_set; + TypeWrapper1 unordered_multiset; static void instantiate(Module& mod); static StlWrappers& instance(); @@ -70,6 +73,8 @@ void apply_deque(TypeWrapper1& deque); void apply_queue(TypeWrapper1& queue); void apply_set(TypeWrapper1& set); void apply_multiset(TypeWrapper1& multiset); +void apply_unordered_set(TypeWrapper1& unordered_set); +void apply_unordered_multiset(TypeWrapper1& unordered_multiset); void apply_shared_ptr(); void apply_weak_ptr(); void apply_unique_ptr(); @@ -249,7 +254,7 @@ struct WrapQueue } }; -struct WrapSet +struct WrapSetType { template void operator()(TypeWrapperT&& wrapped) @@ -269,7 +274,7 @@ struct WrapSet } }; -struct WrapMultiset +struct WrapMultisetType { template void operator()(TypeWrapperT&& wrapped) @@ -321,6 +326,12 @@ template struct container_has_less_than_operator::value>> : has_less_than_operator {}; +template +struct is_hashable : std::false_type {}; + +template +struct is_hashable{}(std::declval()))>> : std::true_type {}; + template inline void apply_stl(jlcxx::Module& mod) { @@ -330,8 +341,13 @@ inline void apply_stl(jlcxx::Module& mod) TypeWrapper1(mod, StlWrappers::instance().queue).apply>(WrapQueue()); if constexpr (container_has_less_than_operator::value) { - TypeWrapper1(mod, StlWrappers::instance().set).apply>(WrapSet()); - TypeWrapper1(mod, StlWrappers::instance().multiset).apply>(WrapMultiset()); + TypeWrapper1(mod, StlWrappers::instance().set).apply>(WrapSetType()); + TypeWrapper1(mod, StlWrappers::instance().multiset).apply>(WrapMultisetType()); + } + if constexpr (is_hashable::value) + { + TypeWrapper1(mod, StlWrappers::instance().unordered_set).apply>(WrapSetType()); + TypeWrapper1(mod, StlWrappers::instance().unordered_multiset).apply>(WrapMultisetType()); } } diff --git a/src/stl.cpp b/src/stl.cpp index 97b89b1..07d4a7b 100644 --- a/src/stl.cpp +++ b/src/stl.cpp @@ -23,6 +23,8 @@ JLCXX_API void StlWrappers::instantiate(Module& mod) apply_queue(m_instance->queue); apply_set(m_instance->set); apply_multiset(m_instance->multiset); + apply_unordered_set(m_instance->unordered_set); + apply_unordered_multiset(m_instance->unordered_multiset); apply_shared_ptr(); apply_weak_ptr(); apply_unique_ptr(); @@ -49,7 +51,9 @@ JLCXX_API StlWrappers::StlWrappers(Module& stl) : deque(stl.add_type>>("StdDeque", julia_type("AbstractVector"))), queue(stl.add_type>>("StdQueue", julia_type("AbstractVector"))), set(stl.add_type>>("StdSet")), - multiset(stl.add_type>>("StdMultiset")) + multiset(stl.add_type>>("StdMultiset")), + unordered_set(stl.add_type>>("StdUnorderedSet")), + unordered_multiset(stl.add_type>>("StdUnorderedMultiset")) { } diff --git a/src/stl_multiset.cpp b/src/stl_multiset.cpp index 3983131..a5e2b3c 100644 --- a/src/stl_multiset.cpp +++ b/src/stl_multiset.cpp @@ -8,7 +8,7 @@ namespace stl void apply_multiset(TypeWrapper1& multiset) { - multiset.apply_combination(stl::WrapMultiset()); + multiset.apply_combination(stl::WrapMultisetType()); } } diff --git a/src/stl_set.cpp b/src/stl_set.cpp index a66a526..6d5874a 100644 --- a/src/stl_set.cpp +++ b/src/stl_set.cpp @@ -8,7 +8,7 @@ namespace stl void apply_set(TypeWrapper1& set) { - set.apply_combination(stl::WrapSet()); + set.apply_combination(stl::WrapSetType()); } } diff --git a/src/stl_unordered_multiset.cpp b/src/stl_unordered_multiset.cpp new file mode 100644 index 0000000..ef84230 --- /dev/null +++ b/src/stl_unordered_multiset.cpp @@ -0,0 +1,16 @@ +#include "jlcxx/stl.hpp" + +namespace jlcxx +{ + +namespace stl +{ + +void apply_unordered_multiset(TypeWrapper1& unordered_multiset) +{ + unordered_multiset.apply_combination(stl::WrapMultisetType()); +} + +} + +} \ No newline at end of file diff --git a/src/stl_unordered_set.cpp b/src/stl_unordered_set.cpp new file mode 100644 index 0000000..0ef0ab6 --- /dev/null +++ b/src/stl_unordered_set.cpp @@ -0,0 +1,16 @@ +#include "jlcxx/stl.hpp" + +namespace jlcxx +{ + +namespace stl +{ + +void apply_unordered_set(TypeWrapper1& unordered_set) +{ + unordered_set.apply_combination(stl::WrapSetType()); +} + +} + +} \ No newline at end of file