diff --git a/CMakeLists.txt b/CMakeLists.txt index f8c58fc..13212b0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -99,6 +99,7 @@ set(JLCXX_STL_SOURCES ${JLCXX_SOURCE_DIR}/stl_deque.cpp ${JLCXX_SOURCE_DIR}/stl_queue.cpp ${JLCXX_SOURCE_DIR}/stl_priority_queue.cpp + ${JLCXX_SOURCE_DIR}/stl_stack.cpp ${JLCXX_SOURCE_DIR}/stl_set.cpp ${JLCXX_SOURCE_DIR}/stl_multiset.cpp ${JLCXX_SOURCE_DIR}/stl_unordered_set.cpp diff --git a/include/jlcxx/stl.hpp b/include/jlcxx/stl.hpp index 6cc5234..c4d0c72 100644 --- a/include/jlcxx/stl.hpp +++ b/include/jlcxx/stl.hpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -53,6 +54,7 @@ class JLCXX_API StlWrappers TypeWrapper1 deque; TypeWrapper1 queue; TypeWrapper1 priority_queue; + TypeWrapper1 stack; TypeWrapper1 set; TypeWrapper1 multiset; TypeWrapper1 unordered_set; @@ -73,6 +75,7 @@ void apply_valarray(TypeWrapper1& valarray); void apply_deque(TypeWrapper1& deque); void apply_queue(TypeWrapper1& queue); void apply_priority_queue(TypeWrapper1& priority_queue); +void apply_stack(TypeWrapper1& stack); void apply_set(TypeWrapper1& set); void apply_multiset(TypeWrapper1& multiset); void apply_unordered_set(TypeWrapper1& unordered_set); @@ -284,6 +287,25 @@ struct WrapPriorityQueue } }; +struct WrapStack +{ + 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("stack_isempty", [] (WrappedT& v) { return v.empty(); }); + wrapped.method("stack_push!", [] (WrappedT& v, const T& val) { v.push(val); }); + wrapped.method("stack_top", [] (WrappedT& v) { return v.top(); }); + wrapped.method("stack_pop!", [] (WrappedT& v) { v.pop(); }); + wrapped.module().unset_override_module(); + } +}; + struct WrapSetType { template @@ -382,6 +404,7 @@ inline void apply_stl(jlcxx::Module& mod) TypeWrapper1(mod, StlWrappers::instance().valarray).apply>(WrapValArray()); TypeWrapper1(mod, StlWrappers::instance().deque).apply>(WrapDeque()); TypeWrapper1(mod, StlWrappers::instance().queue).apply>(WrapQueue()); + TypeWrapper1(mod, StlWrappers::instance().stack).apply>(WrapStack()); if constexpr (container_has_less_than_operator::value) { TypeWrapper1(mod, StlWrappers::instance().set).apply>(WrapSetType()); diff --git a/src/stl.cpp b/src/stl.cpp index 8006f9b..6510fb7 100644 --- a/src/stl.cpp +++ b/src/stl.cpp @@ -22,6 +22,7 @@ JLCXX_API void StlWrappers::instantiate(Module& mod) apply_deque(m_instance->deque); apply_queue(m_instance->queue); apply_priority_queue(m_instance->priority_queue); + apply_stack(m_instance->stack); apply_set(m_instance->set); apply_multiset(m_instance->multiset); apply_unordered_set(m_instance->unordered_set); @@ -53,6 +54,7 @@ JLCXX_API StlWrappers::StlWrappers(Module& stl) : // Assign appropriate parent types after iterators are implemented queue(stl.add_type>>("StdQueue")), priority_queue(stl.add_type>>("StdPriorityQueue")), + stack(stl.add_type>>("StdStack")), set(stl.add_type>>("StdSet")), multiset(stl.add_type>>("StdMultiset")), unordered_set(stl.add_type>>("StdUnorderedSet")), diff --git a/src/stl_stack.cpp b/src/stl_stack.cpp new file mode 100644 index 0000000..5bc5c8f --- /dev/null +++ b/src/stl_stack.cpp @@ -0,0 +1,16 @@ +#include "jlcxx/stl.hpp" + +namespace jlcxx +{ + +namespace stl +{ + +void apply_stack(TypeWrapper1& stack) +{ + stack.apply_combination(stl::WrapStack()); +} + +} + +} \ No newline at end of file