// // immer: immutable data structures for C++ // Copyright (C) 2016, 2017, 2018 Juan Pedro Bolivar Puente // // This software is distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE or copy at http://boost.org/LICENSE_1_0.txt // #include #include #include namespace { using memory_t = immer::memory_policy< immer::unsafe_free_list_heap_policy, immer::unsafe_refcount_policy>; template using js_vector_t = immer::vector; template VectorT range(typename VectorT::value_type first, typename VectorT::value_type last) { auto v = VectorT{}; for (; first != last; ++first) v = std::move(v).push_back(first); return v; } template VectorT range_slow(typename VectorT::value_type first, typename VectorT::value_type last) { auto v = VectorT{}; for (; first != last; ++first) v = v.push_back(first); return v; } template VectorT push_back(VectorT& v, typename VectorT::value_type x) { return v.push_back(x); } template VectorT set(VectorT& v, std::size_t i, typename VectorT::value_type x) { return v.set(i, x); } template void bind_vector(const char* name) { using emscripten::class_; using vector_t = js_vector_t; class_(name) .constructor() .function("push", &push_back) .function("set", &set) .function("get", &vector_t::operator[]) .property("size", &vector_t::size); } } // anonymous namespace EMSCRIPTEN_BINDINGS(immer) { using emscripten::function; bind_vector("Vector"); bind_vector("VectorInt"); bind_vector("VectorNumber"); function("range_int", &range>); function("rangeSlow_int", &range_slow>); function("range_double", &range>); function("rangeSlow_double", &range_slow>); }