├── doc ├── .gitignore ├── Jamfile.v2 ├── segmented_tree.qbk └── images │ ├── accumulate_forward-range-8.svg │ └── accumulate_forward-range-64.svg ├── README.md ├── .gitignore ├── include └── boost │ └── segmented_tree │ ├── CMakeLists.txt │ └── seq_fwd.hpp ├── .clang-format ├── common ├── generate_range_64.cpp ├── generate_range_8.cpp ├── generate_single_8.cpp ├── generate_single_64.cpp ├── CMakeLists.txt ├── generate_single.hpp ├── generate_range.hpp ├── single.hpp ├── iterator.hpp ├── range.hpp └── common.hpp ├── bench ├── range_deque_8.cpp ├── range_vector_8.cpp ├── single_deque_8.cpp ├── range_deque_64.cpp ├── range_vector_64.cpp ├── single_deque_64.cpp ├── single_vector_64.cpp ├── single_vector_8.cpp ├── range_btree_seq_64.cpp ├── range_btree_seq_8.cpp ├── single_btree_seq_8.cpp ├── single_btree_seq_64.cpp ├── range_avl_array_64.cpp ├── range_avl_array_8.cpp ├── single_avl_array_8.cpp ├── single_avl_array_64.cpp ├── range_segmented_tree_seq_64.cpp ├── range_segmented_tree_seq_8.cpp ├── range_bpt_sequence_8.cpp ├── single_segmented_tree_seq_64.cpp ├── single_segmented_tree_seq_8.cpp ├── range_bpt_sequence_64.cpp ├── single_bpt_sequence_64.cpp ├── single_bpt_sequence_8.cpp ├── single.hpp ├── range.hpp ├── common.hpp ├── CMakeLists.txt └── iterator.hpp ├── .gitmodules ├── test ├── Jamfile.v2 ├── CMakeLists.txt └── test_sequence.cpp ├── CMakeLists.txt ├── LICENSE_1_0.txt └── scripts └── bench.py /doc/.gitignore: -------------------------------------------------------------------------------- 1 | autodoc.xml 2 | html 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | See [here](https://det.github.io/segmented_tree) for documentation. 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | CMakeLists.txt.user* 2 | *.kdev4 3 | *.kate-swp 4 | *~ 5 | *.autosave 6 | 7 | -------------------------------------------------------------------------------- /include/boost/segmented_tree/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | add_custom_target(seq SOURCES seq_fwd.hpp seq.hpp) 2 | -------------------------------------------------------------------------------- /.clang-format: -------------------------------------------------------------------------------- 1 | --- 2 | Language: Cpp 3 | BasedOnStyle: Google 4 | DerivePointerAlignment: false 5 | ... 6 | 7 | -------------------------------------------------------------------------------- /common/generate_range_64.cpp: -------------------------------------------------------------------------------- 1 | #include "generate_range.hpp" 2 | 3 | int main(int argc, char** argv) { 4 | return generate_range(argc, argv); 5 | } 6 | -------------------------------------------------------------------------------- /common/generate_range_8.cpp: -------------------------------------------------------------------------------- 1 | #include "generate_range.hpp" 2 | 3 | int main(int argc, char** argv) { 4 | return generate_range(argc, argv); 5 | } 6 | -------------------------------------------------------------------------------- /common/generate_single_8.cpp: -------------------------------------------------------------------------------- 1 | #include "generate_single.hpp" 2 | 3 | int main(int argc, char** argv) { 4 | return generate_single(argc, argv); 5 | } 6 | -------------------------------------------------------------------------------- /common/generate_single_64.cpp: -------------------------------------------------------------------------------- 1 | #include "generate_single.hpp" 2 | 3 | int main(int argc, char** argv) { 4 | return generate_single(argc, argv); 5 | } 6 | -------------------------------------------------------------------------------- /bench/range_deque_8.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include "range.hpp" 3 | 4 | template 5 | using Container = std::deque; 6 | 7 | int main(int argc, char** argv) { 8 | return bench_range(argc, argv); 9 | } 10 | -------------------------------------------------------------------------------- /bench/range_vector_8.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include "range.hpp" 3 | 4 | template 5 | using Container = std::vector; 6 | 7 | int main(int argc, char** argv) { 8 | return bench_range(argc, argv); 9 | } 10 | -------------------------------------------------------------------------------- /bench/single_deque_8.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include "single.hpp" 3 | 4 | template 5 | using Container = std::deque; 6 | 7 | int main(int argc, char** argv) { 8 | return bench_single(argc, argv); 9 | } 10 | -------------------------------------------------------------------------------- /bench/range_deque_64.cpp: -------------------------------------------------------------------------------- 1 | #include "range.hpp" 2 | 3 | #include 4 | 5 | template 6 | using Container = std::deque; 7 | 8 | int main(int argc, char** argv) { 9 | return bench_range(argc, argv); 10 | } 11 | -------------------------------------------------------------------------------- /bench/range_vector_64.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include "range.hpp" 3 | 4 | template 5 | using Container = std::vector; 6 | 7 | int main(int argc, char** argv) { 8 | return bench_range(argc, argv); 9 | } 10 | -------------------------------------------------------------------------------- /bench/single_deque_64.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include "single.hpp" 3 | 4 | template 5 | using Container = std::deque; 6 | 7 | int main(int argc, char** argv) { 8 | return bench_single(argc, argv); 9 | } 10 | -------------------------------------------------------------------------------- /bench/single_vector_64.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include "single.hpp" 3 | 4 | template 5 | using Container = std::vector; 6 | 7 | int main(int argc, char** argv) { 8 | return bench_single(argc, argv); 9 | } 10 | -------------------------------------------------------------------------------- /bench/single_vector_8.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include "single.hpp" 3 | 4 | template 5 | using Container = std::vector; 6 | 7 | int main(int argc, char** argv) { 8 | return bench_single(argc, argv); 9 | } 10 | -------------------------------------------------------------------------------- /bench/range_btree_seq_64.cpp: -------------------------------------------------------------------------------- 1 | #include "array/trunk/btree_seq.h" 2 | #include "range.hpp" 3 | 4 | template 5 | using Container = btree_seq; 6 | 7 | int main(int argc, char** argv) { 8 | return bench_range(argc, argv); 9 | } 10 | -------------------------------------------------------------------------------- /bench/range_btree_seq_8.cpp: -------------------------------------------------------------------------------- 1 | #include "array/trunk/btree_seq.h" 2 | #include "range.hpp" 3 | 4 | template 5 | using Container = btree_seq; 6 | 7 | int main(int argc, char** argv) { 8 | return bench_range(argc, argv); 9 | } 10 | -------------------------------------------------------------------------------- /bench/single_btree_seq_8.cpp: -------------------------------------------------------------------------------- 1 | #include "array/trunk/btree_seq.h" 2 | #include "single.hpp" 3 | 4 | template 5 | using Container = btree_seq; 6 | 7 | int main(int argc, char** argv) { 8 | return bench_single(argc, argv); 9 | } 10 | -------------------------------------------------------------------------------- /bench/single_btree_seq_64.cpp: -------------------------------------------------------------------------------- 1 | #include "array/trunk/btree_seq.h" 2 | #include "single.hpp" 3 | 4 | template 5 | using Container = btree_seq; 6 | 7 | int main(int argc, char** argv) { 8 | return bench_single(argc, argv); 9 | } 10 | -------------------------------------------------------------------------------- /bench/range_avl_array_64.cpp: -------------------------------------------------------------------------------- 1 | #include "avl_array/avl_array/src/avl_array.hpp" 2 | #include "range.hpp" 3 | 4 | template 5 | using Container = mkr::avl_array; 6 | 7 | int main(int argc, char** argv) { 8 | return bench_range(argc, argv); 9 | } 10 | -------------------------------------------------------------------------------- /bench/range_avl_array_8.cpp: -------------------------------------------------------------------------------- 1 | #include "avl_array/avl_array/src/avl_array.hpp" 2 | #include "range.hpp" 3 | 4 | template 5 | using Container = mkr::avl_array; 6 | 7 | int main(int argc, char** argv) { 8 | return bench_range(argc, argv); 9 | } 10 | -------------------------------------------------------------------------------- /bench/single_avl_array_8.cpp: -------------------------------------------------------------------------------- 1 | #include "avl_array/avl_array/src/avl_array.hpp" 2 | #include "single.hpp" 3 | 4 | template 5 | using Container = mkr::avl_array; 6 | 7 | int main(int argc, char** argv) { 8 | return bench_single(argc, argv); 9 | } 10 | -------------------------------------------------------------------------------- /bench/single_avl_array_64.cpp: -------------------------------------------------------------------------------- 1 | #include "avl_array/avl_array/src/avl_array.hpp" 2 | #include "single.hpp" 3 | 4 | template 5 | using Container = mkr::avl_array; 6 | 7 | int main(int argc, char** argv) { 8 | return bench_single(argc, argv); 9 | } 10 | -------------------------------------------------------------------------------- /bench/range_segmented_tree_seq_64.cpp: -------------------------------------------------------------------------------- 1 | #include "boost/segmented_tree/seq.hpp" 2 | #include "range.hpp" 3 | 4 | template 5 | using Container = boost::segmented_tree::seq; 6 | 7 | int main(int argc, char** argv) { 8 | return bench_range(argc, argv); 9 | } 10 | -------------------------------------------------------------------------------- /bench/range_segmented_tree_seq_8.cpp: -------------------------------------------------------------------------------- 1 | #include "boost/segmented_tree/seq.hpp" 2 | #include "range.hpp" 3 | 4 | template 5 | using Container = boost::segmented_tree::seq; 6 | 7 | int main(int argc, char** argv) { 8 | return bench_range(argc, argv); 9 | } 10 | -------------------------------------------------------------------------------- /bench/range_bpt_sequence_8.cpp: -------------------------------------------------------------------------------- 1 | #include "range.hpp" 2 | #include "stl_ext_adv_review/container/bpt_sequence.hpp" 3 | 4 | template 5 | using Container = std_ext_adv::sequence; 6 | 7 | int main(int argc, char** argv) { 8 | return bench_range(argc, argv); 9 | } 10 | -------------------------------------------------------------------------------- /bench/single_segmented_tree_seq_64.cpp: -------------------------------------------------------------------------------- 1 | #include "boost/segmented_tree/seq.hpp" 2 | #include "single.hpp" 3 | 4 | template 5 | using Container = boost::segmented_tree::seq; 6 | 7 | int main(int argc, char** argv) { 8 | return bench_single(argc, argv); 9 | } 10 | -------------------------------------------------------------------------------- /bench/single_segmented_tree_seq_8.cpp: -------------------------------------------------------------------------------- 1 | #include "boost/segmented_tree/seq.hpp" 2 | #include "single.hpp" 3 | 4 | template 5 | using Container = boost::segmented_tree::seq; 6 | 7 | int main(int argc, char** argv) { 8 | return bench_single(argc, argv); 9 | } 10 | -------------------------------------------------------------------------------- /bench/range_bpt_sequence_64.cpp: -------------------------------------------------------------------------------- 1 | #include "range.hpp" 2 | #include "stl_ext_adv_review/container/bpt_sequence.hpp" 3 | 4 | template 5 | using Container = std_ext_adv::sequence; 6 | 7 | int main(int argc, char** argv) { 8 | return bench_range(argc, argv); 9 | } 10 | -------------------------------------------------------------------------------- /bench/single_bpt_sequence_64.cpp: -------------------------------------------------------------------------------- 1 | #include "single.hpp" 2 | #include "stl_ext_adv_review/container/bpt_sequence.hpp" 3 | 4 | template 5 | using Container = std_ext_adv::sequence; 6 | 7 | int main(int argc, char** argv) { 8 | return bench_single(argc, argv); 9 | } 10 | -------------------------------------------------------------------------------- /bench/single_bpt_sequence_8.cpp: -------------------------------------------------------------------------------- 1 | #include "single.hpp" 2 | #include "stl_ext_adv_review/container/bpt_sequence.hpp" 3 | 4 | template 5 | using Container = std_ext_adv::sequence; 6 | 7 | int main(int argc, char** argv) { 8 | return bench_single(argc, argv); 9 | } 10 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "submodule/avl_array"] 2 | path = submodule/avl_array 3 | url = https://github.com/det/avl_array.git 4 | [submodule "submodule/stl_ext_adv_review"] 5 | path = submodule/stl_ext_adv_review 6 | url = https://github.com/vstadnik/stl_ext_adv_review.git 7 | [submodule "submodule/array"] 8 | path = submodule/array 9 | url = https://github.com/alexkupri/array.git 10 | -------------------------------------------------------------------------------- /common/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | add_custom_target(common_headers SOURCES common.hpp generate_range.hpp 2 | generate_single.hpp iterator.hpp range.hpp single.hpp) 3 | 4 | add_executable (generate_single_8 generate_single_8.cpp) 5 | add_executable (generate_single_64 generate_single_64.cpp) 6 | add_executable (generate_range_8 generate_range_8.cpp) 7 | add_executable (generate_range_64 generate_range_64.cpp) 8 | -------------------------------------------------------------------------------- /test/Jamfile.v2: -------------------------------------------------------------------------------- 1 | import testing ; 2 | 3 | project 4 | : requirements 5 | gcc:-std=c++11 6 | clang:-std=c++11 7 | ; 8 | 9 | test-suite "segmented_tree_seq" 10 | : 11 | [ run test_sequence.cpp /boost//unit_test_framework : : : 12 | TARGET_SIZE=0 : test_sequence_0 ] 13 | [ run test_sequence.cpp /boost//unit_test_framework : : : 14 | TARGET_SIZE=512 : test_sequence_512 ] 15 | ; 16 | 17 | -------------------------------------------------------------------------------- /include/boost/segmented_tree/seq_fwd.hpp: -------------------------------------------------------------------------------- 1 | // (C) Copyright Chris Clearwater 2014-2015. Distributed under the Boost 2 | // Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy 3 | // at http://www.boost.org/LICENSE_1_0.txt) 4 | 5 | #ifndef BOOST_SEGMENTED_TREE_SEQ_FWD 6 | #define BOOST_SEGMENTED_TREE_SEQ_FWD 7 | 8 | #include 9 | 10 | namespace boost { 11 | namespace segmented_tree { 12 | template , 13 | std::size_t segment_target = 1024, std::size_t base_target = 768> 14 | class seq; 15 | } 16 | } 17 | 18 | #endif // #ifndef BOOST_SEGMENTED_TREE_SEQ_FWD 19 | -------------------------------------------------------------------------------- /common/generate_single.hpp: -------------------------------------------------------------------------------- 1 | #ifndef BENCH_GENERATE_SINGLE 2 | #define BENCH_GENERATE_SINGLE 3 | 4 | #include 5 | #include 6 | #include "single.hpp" 7 | 8 | template 9 | int generate_single(int argc, char** argv) { 10 | if (argc != 2) { 11 | std::cerr << "Usage: " << argv[0] << " \n"; 12 | return EXIT_FAILURE; 13 | } 14 | 15 | std::random_device device; 16 | auto seed = device(); 17 | auto count = boost::lexical_cast(argv[1]); 18 | auto data = make_insertion_data_single(count, seed); 19 | std::vector container; 20 | insert_single(container, data); 21 | std::cout << seed << " " << make_checksum_unsigned(container) << "\n"; 22 | return EXIT_SUCCESS; 23 | } 24 | 25 | #endif // #ifndef BENCH_GENERATE_SINGLE 26 | -------------------------------------------------------------------------------- /test/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | add_executable(test_sequence_0 test_sequence.cpp) 2 | target_link_libraries(test_sequence_0 ${Boost_LIBRARIES}) 3 | set_property(TARGET test_sequence_0 PROPERTY COMPILE_DEFINITIONS 4 | BOOST_TEST_DYN_LINK TARGET_SIZE=0) 5 | 6 | add_executable(test_sequence_512 test_sequence.cpp) 7 | target_link_libraries(test_sequence_512 ${Boost_LIBRARIES}) 8 | set_property(TARGET test_sequence_512 PROPERTY COMPILE_DEFINITIONS 9 | BOOST_TEST_DYN_LINK TARGET_SIZE=512) 10 | 11 | #include_directories("../../container/test") 12 | #add_executable(test_container_512 test_container.cpp) 13 | #target_link_libraries(test_container_512 boost_container 14 | # boost_unit_test_framework) 15 | #set_property(TARGET test_container_512 PROPERTY COMPILE_DEFINITIONS 16 | # BOOST_TEST_DYN_LINK TARGET_SIZE=512) 17 | -------------------------------------------------------------------------------- /common/generate_range.hpp: -------------------------------------------------------------------------------- 1 | #ifndef BENCH_GENERATE_RANGE 2 | #define BENCH_GENERATE_RANGE 3 | 4 | #include 5 | #include 6 | #include "range.hpp" 7 | 8 | template 9 | int generate_range(int argc, char** argv) { 10 | if (argc != 3) { 11 | std::cerr << "Usage: " << argv[0] << " \n"; 12 | return EXIT_FAILURE; 13 | } 14 | 15 | std::random_device device; 16 | auto seed = device(); 17 | auto count = boost::lexical_cast(argv[1]); 18 | auto size = boost::lexical_cast(argv[2]); 19 | auto data = make_insertion_data_range(count, size, seed); 20 | std::vector container; 21 | insert_range(container, data); 22 | std::cout << seed << " " << make_checksum_unsigned(container) << "\n"; 23 | return EXIT_SUCCESS; 24 | } 25 | 26 | #endif // #ifndef BENCH_GENERATE_RANGE 27 | -------------------------------------------------------------------------------- /doc/Jamfile.v2: -------------------------------------------------------------------------------- 1 | # Copyright Chris Clearwater 2014-2015. 2 | # Use, modification, and distribution are subject to the Boost Software 3 | # License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at 4 | # http://www.boost.org/LICENSE_1_0.txt) 5 | 6 | using quickbook ; 7 | using boostbook ; 8 | using doxygen ; 9 | 10 | doxygen autodoc 11 | : 12 | [ glob ../include/boost/segmented_tree/seq.hpp ] 13 | : 14 | PREDEFINED=\"BOOST_SEGMENTED_TREE_DOXYGEN_INVOKED\" 15 | ; 16 | 17 | xml segmented_tree : segmented_tree.qbk : autodoc ; 18 | boostbook standalone 19 | : 20 | segmented_tree 21 | : 22 | boost.root=http://www.boost.org/doc/libs/1_59_0 23 | # html.stylesheet=boostbook.css 24 | ; 25 | 26 | install svg_install : [ glob images/*.svg ] : html/images ; 27 | #install css-install : ../../../doc/src/boostbook.css : html ; 28 | 29 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required (VERSION 2.8) 2 | project (segmented_tree) 3 | 4 | if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") 5 | set (CMAKE_CXX_FLAGS "-std=c++11 -Weverything -Wno-c++98-compat \ 6 | -Wno-c++98-compat-pedantic -Wno-padded \ 7 | -Wno-disabled-macro-expansion -Wno-global-constructors") 8 | set (CMAKE_CXX_FLAGS_DEBUG "-O1 -g -fsanitize=address -fsanitize=undefined") 9 | set (CMAKE_CXX_FLAGS_RELEASE "-O3 -flto") 10 | elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") 11 | set (CMAKE_CXX_FLAGS "-std=c++11 -Wpedantic -Wall -Wextra \ 12 | -Wno-missing-field-initializers") 13 | set (CMAKE_CXX_FLAGS_DEBUG "-Og -g") 14 | set (CMAKE_CXX_FLAGS_RELEASE "-O2 -flto") 15 | endif () 16 | 17 | if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") 18 | add_definitions(-DBOOST_SEGMENTED_TREE_DEBUG) 19 | endif () 20 | 21 | find_package(Boost COMPONENTS unit_test_framework REQUIRED) 22 | include_directories (include) 23 | include_directories (SYSTEM submodule) 24 | include_directories (SYSTEM ${Boost_INCLUDE_DIRS}) 25 | add_subdirectory (include/boost/segmented_tree) 26 | add_subdirectory (bench) 27 | add_subdirectory (common) 28 | add_subdirectory (test) 29 | -------------------------------------------------------------------------------- /bench/single.hpp: -------------------------------------------------------------------------------- 1 | #ifndef BENCH_SINGLE 2 | #define BENCH_SINGLE 3 | 4 | #include 5 | #include 6 | #include 7 | #include "../common/single.hpp" 8 | #include "iterator.hpp" 9 | 10 | template