merge(3p/immer): Subtree merge at 'ad3e3556d' as 'third_party/immer'
Change-Id: I9636a41ad44b4218293833fd3e9456d9b07c731b
This commit is contained in:
		
						commit
						1213b086a1
					
				
					 311 changed files with 74223 additions and 0 deletions
				
			
		
							
								
								
									
										38
									
								
								third_party/immer/.clang-format
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								third_party/immer/.clang-format
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,38 @@ | ||||||
|  | --- | ||||||
|  | AlignAfterOpenBracket: Align | ||||||
|  | AlignConsecutiveAssignments: 'true' | ||||||
|  | AlignEscapedNewlines: Right | ||||||
|  | AlignTrailingComments: 'true' | ||||||
|  | AllowShortFunctionsOnASingleLine: 'true' | ||||||
|  | AllowShortBlocksOnASingleLine: 'true' | ||||||
|  | AlwaysBreakTemplateDeclarations: 'true' | ||||||
|  | AccessModifierOffset: -4 | ||||||
|  | BinPackArguments: 'false' | ||||||
|  | BinPackParameters: 'false' | ||||||
|  | BreakBeforeBraces: Mozilla | ||||||
|  | BreakBeforeInheritanceComma: 'true' | ||||||
|  | BreakBeforeTernaryOperators: 'true' | ||||||
|  | BreakConstructorInitializers: BeforeComma | ||||||
|  | BreakStringLiterals: 'true' | ||||||
|  | ColumnLimit: '80' | ||||||
|  | CompactNamespaces: 'false' | ||||||
|  | ConstructorInitializerAllOnOneLineOrOnePerLine: 'false' | ||||||
|  | FixNamespaceComments: 'true' | ||||||
|  | IndentCaseLabels: 'false' | ||||||
|  | IndentWidth: '4' | ||||||
|  | IndentWrappedFunctionNames: 'false' | ||||||
|  | KeepEmptyLinesAtTheStartOfBlocks: 'false' | ||||||
|  | Language: Cpp | ||||||
|  | MaxEmptyLinesToKeep: '1' | ||||||
|  | NamespaceIndentation: None | ||||||
|  | PointerAlignment: Left | ||||||
|  | ReflowComments: 'true' | ||||||
|  | SortIncludes: 'true' | ||||||
|  | SortUsingDeclarations: 'true' | ||||||
|  | SpaceAfterCStyleCast: 'true' | ||||||
|  | SpaceAfterTemplateKeyword: 'true' | ||||||
|  | SpaceBeforeAssignmentOperators: 'true' | ||||||
|  | SpaceBeforeParens: ControlStatements | ||||||
|  | TabWidth: '4' | ||||||
|  | UseTab: Never | ||||||
|  | ... | ||||||
							
								
								
									
										7
									
								
								third_party/immer/.dir-locals.el
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								third_party/immer/.dir-locals.el
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,7 @@ | ||||||
|  | ((nil . | ||||||
|  |       ((indent-tabs-mode . nil) | ||||||
|  |        (show-trailing-whitespace . t))) | ||||||
|  |  (c-mode . | ||||||
|  |          ((mode . c++))) | ||||||
|  |  (c++-mode . | ||||||
|  |           ((eval add-hook 'before-save-hook #'clang-format-buffer nil t)))) | ||||||
							
								
								
									
										3
									
								
								third_party/immer/.github/FUNDING.yml
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								third_party/immer/.github/FUNDING.yml
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,3 @@ | ||||||
|  | github: arximboldi | ||||||
|  | patreon: sinusoidal | ||||||
|  | custom: ["paypal.me/sinusoidal", sinusoid.al] | ||||||
							
								
								
									
										24
									
								
								third_party/immer/.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								third_party/immer/.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,24 @@ | ||||||
|  | bazel-* | ||||||
|  | build/ | ||||||
|  | build-*/ | ||||||
|  | reports/ | ||||||
|  | doc/_build | ||||||
|  | doc/_doxygen | ||||||
|  | bazel-* | ||||||
|  | 
 | ||||||
|  | tools/travis/ssh-key | ||||||
|  | tools/clojure/target/ | ||||||
|  | tools/scala/target/ | ||||||
|  | tools/scala/project/target/ | ||||||
|  | 
 | ||||||
|  | extra/js/out | ||||||
|  | extra/js/boost | ||||||
|  | 
 | ||||||
|  | __pycache__ | ||||||
|  | 
 | ||||||
|  | .gdb_history | ||||||
|  | 
 | ||||||
|  | .cache | ||||||
|  | tools/clojure/.lein* | ||||||
|  | 
 | ||||||
|  | *.pyc | ||||||
							
								
								
									
										6
									
								
								third_party/immer/.gitmodules
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								third_party/immer/.gitmodules
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,6 @@ | ||||||
|  | [submodule "extra/python/lib/pybind11"] | ||||||
|  | 	path = extra/python/lib/pybind11 | ||||||
|  | 	url = https://github.com/pybind/pybind11.git | ||||||
|  | [submodule "tools/sinusoidal-sphinx-theme"] | ||||||
|  | 	path = tools/sinusoidal-sphinx-theme | ||||||
|  |         url = https://github.com/arximboldi/sinusoidal-sphinx-theme.git | ||||||
							
								
								
									
										84
									
								
								third_party/immer/.travis.yml
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								third_party/immer/.travis.yml
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,84 @@ | ||||||
|  | language: nix | ||||||
|  | dist: trusty | ||||||
|  | 
 | ||||||
|  | git: | ||||||
|  |   depth: false | ||||||
|  | 
 | ||||||
|  | matrix: | ||||||
|  |   include: | ||||||
|  |     - env: DO=check TYPE=Debug TOOLCHAIN=llvm-5 SANITIZE=true | ||||||
|  |     - env: DO=check TYPE=Release TOOLCHAIN=llvm-5 BENCHMARKS=true | ||||||
|  |     - env: DO=check TYPE=Debug TOOLCHAIN=gnu-6 COVERAGE=true | ||||||
|  |     - env: DO=check TYPE=Release TOOLCHAIN=gnu-6 BENCHMARKS=true | ||||||
|  |     - env: DO=check TYPE=Debug TOOLCHAIN=gnu-7 STD=17 | ||||||
|  |     - env: DO=check TYPE=Debug TOOLCHAIN=llvm-9 STD=17 FUZZERS=true | ||||||
|  |     - env: DO=build | ||||||
|  |     - env: DO=docs | ||||||
|  | 
 | ||||||
|  | before_install: | ||||||
|  |   - | | ||||||
|  |     : ${TOOLCHAIN:=gnu-6} | ||||||
|  |     : ${TYPE:=Debug} | ||||||
|  |     : ${STD:=14} | ||||||
|  |     function build-p { [[ "${DO}" == build ]]; } | ||||||
|  |     function check-p { [[ "${DO}" == check ]]; } | ||||||
|  |     function docs-p  { [[ "${DO}" == docs ]]; } | ||||||
|  |     function coverage-p { [[ "${COVERAGE}" == true ]]; } | ||||||
|  |     function benchmarks-p { [[ "${BENCHMARKS}" == true ]]; } | ||||||
|  |     function deploy-p { | ||||||
|  |         [[ "${TRAVIS_PULL_REQUEST}" == "false" && \ | ||||||
|  |            "${TRAVIS_BRANCH}" == "master" ]] | ||||||
|  |     } | ||||||
|  |     function upload-p { | ||||||
|  |         [[ -n "$encrypted_1c8d51d72e41_key" && \ | ||||||
|  |            -n "$encrypted_1c8d51d72e41_iv" ]] | ||||||
|  |     } | ||||||
|  |     function decrypt-ssh-key { | ||||||
|  |         openssl aes-256-cbc \ | ||||||
|  |             -K  $encrypted_1c8d51d72e41_key \ | ||||||
|  |             -iv $encrypted_1c8d51d72e41_iv \ | ||||||
|  |             -in tools/travis/ssh-key.enc \ | ||||||
|  |             -out tools/travis/ssh-key -d | ||||||
|  |         chmod 600 tools/travis/ssh-key | ||||||
|  |     } | ||||||
|  |     function with-nix { | ||||||
|  |         nix-shell --argstr toolchain $TOOLCHAIN --run "set -e; $1" | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | install: | ||||||
|  |   - with-nix "echo == nix environment ok" | ||||||
|  | 
 | ||||||
|  | before_script: | ||||||
|  |   - | | ||||||
|  |     with-nix " | ||||||
|  |         mkdir build && cd build | ||||||
|  |         cmake .. \ | ||||||
|  |             -DCMAKE_BUILD_TYPE=${TYPE} \ | ||||||
|  |             -DCHECK_SLOW_TESTS=false \ | ||||||
|  |             -DCXX_STANDARD=${STD} \ | ||||||
|  |             -DCHECK_BENCHMARKS=${BENCHMARKS} \ | ||||||
|  |             -DENABLE_COVERAGE=${COVERAGE} \ | ||||||
|  |             -DENABLE_SANITIZE=${SANITIZE} \ | ||||||
|  |             -DCHECK_FUZZERS=${FUZZERS} \ | ||||||
|  |             -DDISABLE_FREE_LIST=${SANITIZE} | ||||||
|  |     " | ||||||
|  | 
 | ||||||
|  | script: | ||||||
|  |   - | | ||||||
|  |     set -e | ||||||
|  |     ! build-p || nix-build | ||||||
|  |     ! check-p || with-nix "cd build && make -j2 check" | ||||||
|  |     ! docs-p  || with-nix "cd build && make docs" | ||||||
|  | 
 | ||||||
|  | after_success: | ||||||
|  |   - | | ||||||
|  |     ! coverage-p || with-nix " | ||||||
|  |         cd build | ||||||
|  |         find . -name \"*.gcno\" | xargs gcov -bcprs ${PWD} | ||||||
|  |         bash <(curl -s https://codecov.io/bash) -x gcov | ||||||
|  |     " | ||||||
|  |     if upload-p; then | ||||||
|  |         decrypt-ssh-key | ||||||
|  |         ! benchmarks-p || with-nix "cd build && make upload-benchmark-reports" | ||||||
|  |         ! docs-p || ! deploy-p || with-nix "cd build && make upload-docs" | ||||||
|  |     fi | ||||||
							
								
								
									
										11
									
								
								third_party/immer/BUILD
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								third_party/immer/BUILD
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,11 @@ | ||||||
|  | package(default_visibility = ["//visibility:public"]) | ||||||
|  | 
 | ||||||
|  | cc_library( | ||||||
|  |     name = "immer", | ||||||
|  |     include_prefix = "immer", | ||||||
|  |     strip_include_prefix = | ||||||
|  |         "immer", | ||||||
|  |     hdrs = glob([ | ||||||
|  |         "immer/**/*.hpp", | ||||||
|  |     ]), | ||||||
|  | ) | ||||||
							
								
								
									
										141
									
								
								third_party/immer/CMakeLists.txt
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										141
									
								
								third_party/immer/CMakeLists.txt
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,141 @@ | ||||||
|  | 
 | ||||||
|  | cmake_minimum_required(VERSION 3.5.1) | ||||||
|  | cmake_policy(SET CMP0048 NEW) # enable project VERSION | ||||||
|  | cmake_policy(SET CMP0056 NEW) # honor link flags in try_compile() | ||||||
|  | list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") | ||||||
|  | 
 | ||||||
|  | project(immer VERSION 0.6.2) | ||||||
|  | 
 | ||||||
|  | if (NOT MSVC) | ||||||
|  |   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pedantic -Wno-unused-parameter -Wno-extended-offsetof -Wno-c++17-extensions -Wno-c++1z-extensions -Wno-unknown-warning-option") | ||||||
|  | endif() | ||||||
|  | set(CMAKE_EXPORT_COMPILE_COMMANDS on) | ||||||
|  | set(CMAKE_CXX_EXTENSIONS off) | ||||||
|  | if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") | ||||||
|  |   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Qunused-arguments") | ||||||
|  | endif() | ||||||
|  | 
 | ||||||
|  | include(GNUInstallDirs) | ||||||
|  | include(ImmerUtils) | ||||||
|  | 
 | ||||||
|  | #  Options | ||||||
|  | #  ======= | ||||||
|  | 
 | ||||||
|  | option(ENABLE_SANITIZE "compile with sanitizers enabled") | ||||||
|  | option(ENABLE_COVERAGE "compile with test coverage support") | ||||||
|  | option(DISABLE_WERROR "enable --werror") | ||||||
|  | option(DISABLE_FREE_LIST "disables the free list heap") | ||||||
|  | option(DISABLE_THREAD_SAFETY "disables thread safety by default") | ||||||
|  | option(CHECK_FUZZERS "Add fuzzers as part of make check") | ||||||
|  | 
 | ||||||
|  | option(ENABLE_PYTHON "enable building python module" off) | ||||||
|  | option(ENABLE_GUILE "enable building guile module" off) | ||||||
|  | option(ENABLE_BOOST_COROUTINE "run benchmarks with boost coroutine" off) | ||||||
|  | 
 | ||||||
|  | option(immer_BUILD_TESTS "Build tests" ON) | ||||||
|  | option(immer_BUILD_EXAMPLES "Build examples" ON) | ||||||
|  | option(immer_BUILD_DOCS "Build docs" ON) | ||||||
|  | option(immer_BUILD_EXTRAS "Build extras" ON) | ||||||
|  | 
 | ||||||
|  | set(CXX_STANDARD 14 CACHE STRING "c++ standard number") | ||||||
|  | 
 | ||||||
|  | set(CMAKE_CXX_STANDARD ${CXX_STANDARD}) | ||||||
|  | set(CMAKE_CXX_STANDARD_REQUIRED on) | ||||||
|  | 
 | ||||||
|  | if (ENABLE_SANITIZE) | ||||||
|  |   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fsanitize=leak") | ||||||
|  | endif() | ||||||
|  | if (NOT MSVC AND NOT DISABLE_WERROR) | ||||||
|  |   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror") | ||||||
|  | endif() | ||||||
|  | 
 | ||||||
|  | #  Dependencies | ||||||
|  | #  ============ | ||||||
|  | 
 | ||||||
|  | if (ENABLE_BOOST_COROUTINE) | ||||||
|  |   set(immer_boost_components coroutine) | ||||||
|  | endif() | ||||||
|  | 
 | ||||||
|  | find_package(Threads) | ||||||
|  | find_package(BoehmGC) | ||||||
|  | find_package(Boost 1.56 COMPONENTS ${immer_boost_components}) | ||||||
|  | 
 | ||||||
|  | find_program(CCACHE ccache) | ||||||
|  | if (CCACHE) | ||||||
|  |   message(STATUS "Using ccache: ${CCACHE}") | ||||||
|  |   set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE}) | ||||||
|  |   set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE}) | ||||||
|  | else() | ||||||
|  |   message(STATUS "Could not find ccache") | ||||||
|  | endif() | ||||||
|  | 
 | ||||||
|  | if (NOT BOEHM_GC_FOUND) | ||||||
|  |   set(BOEHM_GC_LIBRARIES "") | ||||||
|  | endif() | ||||||
|  | 
 | ||||||
|  | #  Targets | ||||||
|  | #  ======= | ||||||
|  | 
 | ||||||
|  | # the library | ||||||
|  | add_library(immer INTERFACE) | ||||||
|  | target_include_directories(immer INTERFACE | ||||||
|  |   $<BUILD_INTERFACE:${immer_BINARY_DIR}/> | ||||||
|  |   $<BUILD_INTERFACE:${immer_SOURCE_DIR}/> | ||||||
|  |   $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>) | ||||||
|  | install(TARGETS immer EXPORT ImmerConfig) | ||||||
|  | install(EXPORT ImmerConfig DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Immer") | ||||||
|  | install(DIRECTORY immer DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") | ||||||
|  | 
 | ||||||
|  | # development target to be used in tests, examples, benchmarks... | ||||||
|  | immer_canonicalize_cmake_booleans( | ||||||
|  |   DISABLE_FREE_LIST | ||||||
|  |   DISABLE_THREAD_SAFETY | ||||||
|  |   CHECK_SLOW_TESTS) | ||||||
|  | add_library(immer-dev INTERFACE) | ||||||
|  | target_include_directories(immer-dev SYSTEM INTERFACE | ||||||
|  |   ${Boost_INCLUDE_DIR} | ||||||
|  |   ${BOEHM_GC_INCLUDE_DIR} | ||||||
|  |   ${CMAKE_CURRENT_SOURCE_DIR}/tools/include) | ||||||
|  | target_link_libraries(immer-dev INTERFACE | ||||||
|  |   immer | ||||||
|  |   ${BOEHM_GC_LIBRARIES} | ||||||
|  |   ${CMAKE_THREAD_LIBS_INIT}) | ||||||
|  | target_compile_definitions(immer-dev INTERFACE | ||||||
|  |   -DIMMER_CXX_STANDARD=${CXX_STANDARD} | ||||||
|  |   -DIMMER_HAS_LIBGC=1 | ||||||
|  |   -DIMMER_NO_FREE_LIST=${DISABLE_FREE_LIST} | ||||||
|  |   -DIMMER_NO_THREAD_SAFETY=${DISABLE_THREAD_SAFETY} | ||||||
|  |   -DIMMER_SLOW_TESTS=${CHECK_SLOW_TESTS}) | ||||||
|  | if (ENABLE_COVERAGE) | ||||||
|  |   target_compile_options(immer-dev INTERFACE "--coverage") | ||||||
|  |   target_link_libraries(immer-dev INTERFACE "--coverage") | ||||||
|  | endif() | ||||||
|  | 
 | ||||||
|  | #  Testing | ||||||
|  | #  ======= | ||||||
|  | 
 | ||||||
|  | if (immer_BUILD_TESTS) | ||||||
|  |   enable_testing() | ||||||
|  | 
 | ||||||
|  |   add_custom_target(check | ||||||
|  |     COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure | ||||||
|  |     WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} | ||||||
|  |     COMMENT "Build and run all the tests and examples.") | ||||||
|  | 
 | ||||||
|  |   add_subdirectory(test) | ||||||
|  |   add_subdirectory(benchmark) | ||||||
|  | endif() | ||||||
|  | 
 | ||||||
|  | if (immer_BUILD_EXAMPLES) | ||||||
|  |   add_subdirectory(example) | ||||||
|  | endif() | ||||||
|  | 
 | ||||||
|  | if (immer_BUILD_DOCS) | ||||||
|  |   add_subdirectory(doc) | ||||||
|  | endif() | ||||||
|  | 
 | ||||||
|  | if (immer_BUILD_EXTRAS) | ||||||
|  |   add_subdirectory(extra/fuzzer) | ||||||
|  |   add_subdirectory(extra/python) | ||||||
|  |   add_subdirectory(extra/guile) | ||||||
|  | endif() | ||||||
							
								
								
									
										23
									
								
								third_party/immer/LICENSE
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								third_party/immer/LICENSE
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,23 @@ | ||||||
|  | Boost Software License - Version 1.0 - August 17th, 2003 | ||||||
|  | 
 | ||||||
|  | Permission is hereby granted, free of charge, to any person or organization | ||||||
|  | obtaining a copy of the software and accompanying documentation covered by | ||||||
|  | this license (the "Software") to use, reproduce, display, distribute, | ||||||
|  | execute, and transmit the Software, and to prepare derivative works of the | ||||||
|  | Software, and to permit third-parties to whom the Software is furnished to | ||||||
|  | do so, all subject to the following: | ||||||
|  | 
 | ||||||
|  | The copyright notices in the Software and this entire statement, including | ||||||
|  | the above license grant, this restriction and the following disclaimer, | ||||||
|  | must be included in all copies of the Software, in whole or in part, and | ||||||
|  | all derivative works of the Software, unless such copies or derivative | ||||||
|  | works are solely in the form of machine-executable object code generated by | ||||||
|  | a source language processor. | ||||||
|  | 
 | ||||||
|  | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  | FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT | ||||||
|  | SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE | ||||||
|  | FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, | ||||||
|  | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | ||||||
|  | DEALINGS IN THE SOFTWARE. | ||||||
							
								
								
									
										225
									
								
								third_party/immer/README.rst
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										225
									
								
								third_party/immer/README.rst
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,225 @@ | ||||||
|  | 
 | ||||||
|  | .. image:: https://travis-ci.org/arximboldi/immer.svg?branch=master | ||||||
|  |    :target: https://travis-ci.org/arximboldi/immer | ||||||
|  |    :alt: Travis Badge | ||||||
|  | 
 | ||||||
|  | .. image:: https://codecov.io/gh/arximboldi/immer/branch/master/graph/badge.svg | ||||||
|  |    :target: https://codecov.io/gh/arximboldi/immer | ||||||
|  |    :alt: CodeCov Badge | ||||||
|  | 
 | ||||||
|  | .. image:: https://cdn.rawgit.com/arximboldi/immer/355a113782aedc2ea22463444014809269c2376d/doc/_static/sinusoidal-badge.svg | ||||||
|  |    :target: https://sinusoid.al | ||||||
|  |    :alt: Sinusoidal Engineering badge | ||||||
|  |    :align: right | ||||||
|  | 
 | ||||||
|  | .. raw:: html | ||||||
|  | 
 | ||||||
|  |    <img width="100%" src="https://cdn.rawgit.com/arximboldi/immer/3888170d247359cc0905eed548cd46897caef0f4/doc/_static/logo-front.svg" alt="Logotype"/> | ||||||
|  | 
 | ||||||
|  | .. include:introduction/start | ||||||
|  | 
 | ||||||
|  | **immer** is a library of persistent_ and immutable_ data structures | ||||||
|  | written in C++.  These enable whole new kinds of architectures for | ||||||
|  | interactive and concurrent programs of striking simplicity, | ||||||
|  | correctness, and performance. | ||||||
|  | 
 | ||||||
|  | .. _persistent: https://en.wikipedia.org/wiki/Persistent_data_structure | ||||||
|  | .. _immutable:  https://en.wikipedia.org/wiki/Immutable_object | ||||||
|  | 
 | ||||||
|  | * **Documentation** (Contents_) | ||||||
|  | * **Code** (GitHub_) | ||||||
|  | * **CppCon'17 Talk**: *Postmodern Immutable Data Structures* (YouTube_, Slides_) | ||||||
|  | * **ICFP'17 Paper**: *Persistence for the masses* (Preprint_) | ||||||
|  | 
 | ||||||
|  | .. _contents: https://sinusoid.es/immer/#contents | ||||||
|  | .. _github: https://github.com/arximboldi/immer | ||||||
|  | .. _youtube: https://www.youtube.com/watch?v=sPhpelUfu8Q | ||||||
|  | .. _slides: https://sinusoid.es/talks/immer-cppcon17 | ||||||
|  | .. _preprint: https://public.sinusoid.es/misc/immer/immer-icfp17.pdf | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   .. raw:: html | ||||||
|  | 
 | ||||||
|  |      <a href="https://www.patreon.com/sinusoidal"> | ||||||
|  |          <img align="right" src="https://cdn.rawgit.com/arximboldi/immer/master/doc/_static/patreon.svg"> | ||||||
|  |      </a> | ||||||
|  | 
 | ||||||
|  |   This library has full months of *pro bono* research and development | ||||||
|  |   invested in it.  This is just the first step in a long-term vision | ||||||
|  |   of making interactive and concurrent C++ programs easier to | ||||||
|  |   write. **Put your logo here and help this project's long term | ||||||
|  |   sustainability by buying a sponsorship package:** immer@sinusoid.al | ||||||
|  | 
 | ||||||
|  | .. include:index/end | ||||||
|  | 
 | ||||||
|  | Example | ||||||
|  | ------- | ||||||
|  | 
 | ||||||
|  | .. github does not support the ``literalinclude`` directive.  This | ||||||
|  |    example is copy pasted from ``example/vector/intro.cpp`` | ||||||
|  | 
 | ||||||
|  | .. code-block:: c++ | ||||||
|  | 
 | ||||||
|  |    #include <immer/vector.hpp> | ||||||
|  |    int main() | ||||||
|  |    { | ||||||
|  |        const auto v0 = immer::vector<int>{}; | ||||||
|  |        const auto v1 = v0.push_back(13); | ||||||
|  |        assert(v0.size() == 0 && v1.size() == 1 && v1[0] == 13); | ||||||
|  | 
 | ||||||
|  |        const auto v2 = v1.set(0, 42); | ||||||
|  |        assert(v1[0] == 13 && v2[0] == 42); | ||||||
|  |    } | ||||||
|  | .. | ||||||
|  | 
 | ||||||
|  |   For a **complete example** check `Ewig, a simple didactic | ||||||
|  |   text-editor <https://github.com/arximboldi/ewig>`_ built with this | ||||||
|  |   library.  You may also wanna check `Lager, a Redux-like library | ||||||
|  |   <https://github.com/arximboldi/lager>`_ for writting interactive | ||||||
|  |   software in C++ using a value-oriented design. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Why? | ||||||
|  | ---- | ||||||
|  | 
 | ||||||
|  | In the last few years, there has been a growing interest in immutable | ||||||
|  | data structures, motivated by the horizontal scaling of our processing | ||||||
|  | power and the ubiquity of highly interactive systems.  Languages like | ||||||
|  | Clojure_ and Scala_ provide them by default, and implementations | ||||||
|  | for JavaScript like Mori_ and Immutable.js_ are widely used, | ||||||
|  | specially in combination with modern UI frameworks like React_. | ||||||
|  | 
 | ||||||
|  | Interactivity | ||||||
|  |     Thanks to *persistence* and *structural sharing*, new values can | ||||||
|  |     be efficiently compared with old ones.  This enables simpler ways of | ||||||
|  |     *reasoning about change* that sit at the core of modern | ||||||
|  |     interactive systems programming paradigms like `reactive | ||||||
|  |     programming`_. | ||||||
|  | 
 | ||||||
|  | Concurrency | ||||||
|  |     Passing immutable data structures by value does not need to copy | ||||||
|  |     any data. In the absence of mutation, data can be safely read | ||||||
|  |     from multiple concurrent processes, and enable concurrency | ||||||
|  |     patterns like `share by communicating`_ efficiently. | ||||||
|  | 
 | ||||||
|  | Parallelism | ||||||
|  |    Some recent immutable data structures have interesting properties | ||||||
|  |    like :math:`O(log(n))` concatenation, which enable new kinds of | ||||||
|  |    `parallelization algorithms`_. | ||||||
|  | 
 | ||||||
|  | .. _clojure: http://clojure.org/reference/data_structures | ||||||
|  | .. _scala: http://docs.scala-lang.org/overviews/collections/overview.html | ||||||
|  | 
 | ||||||
|  | .. _mori: https://swannodette.github.io/mori/ | ||||||
|  | .. _immutable.js: https://github.com/facebook/immutable-js | ||||||
|  | .. _react: https://facebook.github.io/react/ | ||||||
|  | 
 | ||||||
|  | .. _reactive programming: https://en.wikipedia.org/wiki/Reactive_programming | ||||||
|  | .. _share by communicating: https://blog.golang.org/share-memory-by-communicating | ||||||
|  | .. _parallelization algorithms: http://docs.scala-lang.org/overviews/parallel-collections/overview.html | ||||||
|  | 
 | ||||||
|  | Features | ||||||
|  | -------- | ||||||
|  | 
 | ||||||
|  | Idiomatic | ||||||
|  |     This library doesn't pretend that it is written in Haskell.  It | ||||||
|  |     leverages features from recent standards to provide an API that is | ||||||
|  |     both efficient and natural for a C++ developer. | ||||||
|  | 
 | ||||||
|  | Performant | ||||||
|  |     You use C++ because you need this.  *Immer* implements state of | ||||||
|  |     the art data structures with efficient cache utilization and have | ||||||
|  |     been proven production ready in other languages.  It also includes | ||||||
|  |     our own improvements over that are only possible because of the | ||||||
|  |     C++'s ability to abstract over memory layout.  We monitor the | ||||||
|  |     performance impact of every change by collecting `benchmark | ||||||
|  |     results`_ directly from CI. | ||||||
|  | 
 | ||||||
|  | .. _benchmark results: https://public.sinusoid.es/misc/immer/reports/ | ||||||
|  | 
 | ||||||
|  | Customizable | ||||||
|  |     We leverage templates and `policy-based design`_ to build | ||||||
|  |     data-structures that can be adapted to work efficiently for | ||||||
|  |     various purposes and architectures, for example, by choosing among | ||||||
|  |     various `memory management strategies`.  This turns | ||||||
|  |     *immer* into a good foundation to provide immutable data | ||||||
|  |     structures to higher level languages with a C runtime, like | ||||||
|  |     Python_ or Guile_. | ||||||
|  | 
 | ||||||
|  | .. _python: https://www.python.org/ | ||||||
|  | .. _guile: https://www.gnu.org/software/guile/ | ||||||
|  | .. _policy-based design: https://en.wikipedia.org/wiki/Policy-based_design | ||||||
|  | .. _memory management strategies: https://sinusoid.es/immer/memory.html | ||||||
|  | 
 | ||||||
|  | Dependencies | ||||||
|  | ------------ | ||||||
|  | 
 | ||||||
|  | This library is written in **C++14** and a compliant compiler is | ||||||
|  | necessary.  It is `continuously tested`_ with Clang 3.8 and GCC 6, but | ||||||
|  | it might work with other compilers and versions. | ||||||
|  | 
 | ||||||
|  | No external library is necessary and there are no other requirements. | ||||||
|  | 
 | ||||||
|  | .. _continuously tested: https://travis-ci.org/arximboldi/immer | ||||||
|  | 
 | ||||||
|  | Usage | ||||||
|  | ----- | ||||||
|  | 
 | ||||||
|  | This is a **header only** library.  You can just copy the ``immer`` | ||||||
|  | subfolder somewhere in your *include path*. | ||||||
|  | 
 | ||||||
|  | If you are using the `Nix package manager`_ (we strongly recommend it) | ||||||
|  | you can just:: | ||||||
|  | 
 | ||||||
|  |     nix-env -if https://github.com/arximboldi/immer/archive/master.tar.gz | ||||||
|  | 
 | ||||||
|  | Alternatively, you can use `CMake`_ to install the library in your | ||||||
|  | system once you have manually cloned the repository:: | ||||||
|  | 
 | ||||||
|  |     mkdir -p build && cd build | ||||||
|  |     cmake .. && sudo make install | ||||||
|  | 
 | ||||||
|  | .. _nix package manager: https://nixos.org/nix | ||||||
|  | .. _cmake: https://cmake.org/ | ||||||
|  | 
 | ||||||
|  | Development | ||||||
|  | ----------- | ||||||
|  | 
 | ||||||
|  | In order to develop the library, you will need to compile and run the | ||||||
|  | examples, tests and benchmarks.  These require some additional tools. | ||||||
|  | The easiest way to install them is by using the `Nix package | ||||||
|  | manager`_.  At the root of the repository just type:: | ||||||
|  | 
 | ||||||
|  |     nix-shell | ||||||
|  | 
 | ||||||
|  | This will download all required dependencies and create an isolated | ||||||
|  | environment in which you can use these dependencies, without polluting | ||||||
|  | your system. | ||||||
|  | 
 | ||||||
|  | Then you can proceed to generate a development project using `CMake`_:: | ||||||
|  | 
 | ||||||
|  |     mkdir build && cd build | ||||||
|  |     cmake .. | ||||||
|  | 
 | ||||||
|  | From then on, one may build and run all tests by doing:: | ||||||
|  | 
 | ||||||
|  |     make check | ||||||
|  | 
 | ||||||
|  | In order to build and run all benchmarks when running ``make check``, | ||||||
|  | run ``cmake`` again with the option ``-DCHECK_BENCHMARKS=1``.  The | ||||||
|  | results of running the benchmarks will be saved to a folder | ||||||
|  | ``reports/`` in the project root. | ||||||
|  | 
 | ||||||
|  | License | ||||||
|  | ------- | ||||||
|  | 
 | ||||||
|  | **This software is licensed under the Boost Software License 1.0**. | ||||||
|  | 
 | ||||||
|  | .. image:: https://upload.wikimedia.org/wikipedia/commons/c/cd/Boost.png | ||||||
|  |    :alt: Boost logo | ||||||
|  |    :target: http://boost.org/LICENSE_1_0.txt | ||||||
|  |    :align: right | ||||||
|  | 
 | ||||||
|  | The full text of the license is can be accessed `via this link | ||||||
|  | <http://boost.org/LICENSE_1_0.txt>`_ and is also included | ||||||
|  | in the ``LICENSE`` file of this software package. | ||||||
							
								
								
									
										0
									
								
								third_party/immer/WORKSPACE
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								third_party/immer/WORKSPACE
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
									
										128
									
								
								third_party/immer/benchmark/CMakeLists.txt
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								third_party/immer/benchmark/CMakeLists.txt
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,128 @@ | ||||||
|  | 
 | ||||||
|  | #  Config | ||||||
|  | #  ====== | ||||||
|  | 
 | ||||||
|  | option(CHECK_BENCHMARKS "Run benchmarks on check target" off) | ||||||
|  | option(BENCHMARK_DISABLE_GC "Disable gc during a measurement") | ||||||
|  | 
 | ||||||
|  | set(BENCHMARK_PARAM   "N:1000" CACHE STRING "Benchmark parameters") | ||||||
|  | set(BENCHMARK_SAMPLES "20"     CACHE STRING "Benchmark samples") | ||||||
|  | 
 | ||||||
|  | #  Dependencies | ||||||
|  | #  ============ | ||||||
|  | 
 | ||||||
|  | find_package(RRB) | ||||||
|  | 
 | ||||||
|  | if (NOT RRB_FOUND) | ||||||
|  |   message(STATUS "Disabling benchmarks") | ||||||
|  |   return() | ||||||
|  | endif() | ||||||
|  | 
 | ||||||
|  | # These are expected to be in the include path, the nix-shell | ||||||
|  | # environment installs them: | ||||||
|  | # | ||||||
|  | #    https://github.com/marcusz/steady | ||||||
|  | #    https://github.com/deepsea-inria/chunkedseq.git | ||||||
|  | #    https://github.com/rsms/immutable-cpp.git | ||||||
|  | 
 | ||||||
|  | #  Targets | ||||||
|  | #  ======= | ||||||
|  | 
 | ||||||
|  | add_custom_target(benchmarks | ||||||
|  |   COMMENT "Build all benchmarks.") | ||||||
|  | 
 | ||||||
|  | execute_process( | ||||||
|  |   COMMAND git log -1 --format=%h | ||||||
|  |   WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} | ||||||
|  |   OUTPUT_VARIABLE immer_git_commit_hash | ||||||
|  |   OUTPUT_STRIP_TRAILING_WHITESPACE) | ||||||
|  | 
 | ||||||
|  | execute_process( | ||||||
|  |   COMMAND git status --porcelain | ||||||
|  |   WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} | ||||||
|  |   OUTPUT_VARIABLE immer_git_status | ||||||
|  |   OUTPUT_STRIP_TRAILING_WHITESPACE) | ||||||
|  | 
 | ||||||
|  | if (NOT immer_git_status STREQUAL "") | ||||||
|  |   set(immer_git_commit_hash "${immer_git_commit_hash}+") | ||||||
|  | endif() | ||||||
|  | 
 | ||||||
|  | site_name(immer_hostname) | ||||||
|  | 
 | ||||||
|  | get_filename_component(immer_compiler_name "${CMAKE_CXX_COMPILER}" NAME) | ||||||
|  | 
 | ||||||
|  | set(immer_benchmark_report_base_dir "${CMAKE_SOURCE_DIR}/reports") | ||||||
|  | set(immer_benchmark_report_dir "${immer_benchmark_report_base_dir}/report_\ | ||||||
|  | ${immer_git_commit_hash}_\ | ||||||
|  | ${immer_hostname}_\ | ||||||
|  | ${immer_compiler_name}_\ | ||||||
|  | ${BENCHMARK_PARAM}_\ | ||||||
|  | s${BENCHMARK_SAMPLES}") | ||||||
|  | 
 | ||||||
|  | if(DISABLE_FREE_LIST) | ||||||
|  |   set(immer_benchmark_report_dir "${immer_benchmark_report_dir}_nofl") | ||||||
|  | endif() | ||||||
|  | 
 | ||||||
|  | if(DISABLE_THREAD_SAFETY) | ||||||
|  |   set(immer_benchmark_report_dir "${immer_benchmark_report_dir}_nots") | ||||||
|  | endif() | ||||||
|  | 
 | ||||||
|  | if(BENCHMARK_DISABLE_GC) | ||||||
|  |   set(immer_benchmark_report_dir "${immer_benchmark_report_dir}_nogc") | ||||||
|  | endif() | ||||||
|  | 
 | ||||||
|  | if(CHECK_BENCHMARKS) | ||||||
|  |   add_dependencies(check benchmarks) | ||||||
|  | endif() | ||||||
|  | 
 | ||||||
|  | add_custom_target(benchmark-report-dir | ||||||
|  |   COMMAND ${CMAKE_COMMAND} | ||||||
|  |   -E make_directory ${immer_benchmark_report_dir}) | ||||||
|  | 
 | ||||||
|  | file(GLOB_RECURSE immer_benchmarks "*.cpp") | ||||||
|  | foreach(_file IN LISTS immer_benchmarks) | ||||||
|  |   immer_target_name_for(_target _output "${_file}") | ||||||
|  |   add_executable(${_target} EXCLUDE_FROM_ALL "${_file}") | ||||||
|  |   set_target_properties(${_target} PROPERTIES OUTPUT_NAME ${_output}) | ||||||
|  |   add_dependencies(benchmarks ${_target}) | ||||||
|  |   add_dependencies(${_target} benchmark-report-dir) | ||||||
|  |   target_compile_options(${_target} PUBLIC -Wno-unused-function) | ||||||
|  |   target_compile_definitions(${_target} PUBLIC | ||||||
|  |     NONIUS_RUNNER | ||||||
|  |     IMMER_BENCHMARK_LIBRRB=1 | ||||||
|  |     IMMER_BENCHMARK_STEADY=1 | ||||||
|  |     IMMER_BENCHMARK_EXPERIMENTAL=0 | ||||||
|  |     IMMER_BENCHMARK_DISABLE_GC=${BENCHMARK_DISABLE_GC} | ||||||
|  |     IMMER_BENCHMARK_BOOST_COROUTINE=${ENABLE_BOOST_COROUTINE}) | ||||||
|  |   target_link_libraries(${_target} PUBLIC | ||||||
|  |     immer-dev | ||||||
|  |     ${RRB_LIBRARIES}) | ||||||
|  |   target_include_directories(${_target} SYSTEM PUBLIC | ||||||
|  |     ${RRB_INCLUDE_DIR}) | ||||||
|  |   if(CHECK_BENCHMARKS) | ||||||
|  |     add_test("benchmark/${_output}" "${CMAKE_SOURCE_DIR}/tools/with-tee.bash" | ||||||
|  |       ${immer_benchmark_report_dir}/${_target}.out | ||||||
|  |       "${CMAKE_CURRENT_BINARY_DIR}/${_output}" -v | ||||||
|  |       -t ${_target} | ||||||
|  |       -r html | ||||||
|  |       -s ${BENCHMARK_SAMPLES} | ||||||
|  |       -p ${BENCHMARK_PARAM} | ||||||
|  |       -o ${immer_benchmark_report_dir}/${_target}.html) | ||||||
|  |   endif() | ||||||
|  | endforeach() | ||||||
|  | 
 | ||||||
|  | set(immer_ssh_method | ||||||
|  |   ssh -p 5488 | ||||||
|  |       -o StrictHostKeyChecking=no | ||||||
|  |       -i ${CMAKE_SOURCE_DIR}/tools/travis/ssh-key) | ||||||
|  | 
 | ||||||
|  | add_custom_target(upload-benchmark-reports | ||||||
|  |   COMMAND | ||||||
|  |   rsync -av -e \"${immer_ssh_method}\" | ||||||
|  |         ${immer_benchmark_report_base_dir} | ||||||
|  |         raskolnikov@sinusoid.es:public/misc/immer/) | ||||||
|  | 
 | ||||||
|  | add_custom_target(copy-benchmark-reports | ||||||
|  |   COMMAND | ||||||
|  |   rsync -av ${immer_benchmark_report_base_dir} | ||||||
|  |         ~/public/misc/immer/) | ||||||
							
								
								
									
										55
									
								
								third_party/immer/benchmark/config.hpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								third_party/immer/benchmark/config.hpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,55 @@ | ||||||
|  | //
 | ||||||
|  | // 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
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include <nonius.h++> | ||||||
|  | 
 | ||||||
|  | #include <immer/heap/gc_heap.hpp> | ||||||
|  | #include <immer/memory_policy.hpp> | ||||||
|  | 
 | ||||||
|  | namespace { | ||||||
|  | 
 | ||||||
|  | NONIUS_PARAM(N, std::size_t{1000}) | ||||||
|  | 
 | ||||||
|  | struct gc_disable | ||||||
|  | { | ||||||
|  |     gc_disable() | ||||||
|  |     { | ||||||
|  | #if IMMER_BENCHMARK_DISABLE_GC | ||||||
|  |         GC_disable(); | ||||||
|  | #else | ||||||
|  |         GC_gcollect(); | ||||||
|  | #endif | ||||||
|  |     } | ||||||
|  |     ~gc_disable() | ||||||
|  |     { | ||||||
|  | #if IMMER_BENCHMARK_DISABLE_GC | ||||||
|  |         GC_enable(); | ||||||
|  |         GC_gcollect(); | ||||||
|  | #endif | ||||||
|  |     } | ||||||
|  |     gc_disable(const gc_disable&) = delete; | ||||||
|  |     gc_disable(gc_disable&&) = delete; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | template <typename Meter, typename Fn> | ||||||
|  | void measure(Meter& m, Fn&& fn) | ||||||
|  | { | ||||||
|  |     gc_disable guard; | ||||||
|  |     return m.measure(std::forward<Fn>(fn)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | using def_memory    = immer::default_memory_policy; | ||||||
|  | using gc_memory     = immer::memory_policy<immer::heap_policy<immer::gc_heap>, immer::no_refcount_policy>; | ||||||
|  | using gcf_memory    = immer::memory_policy<immer::heap_policy<immer::gc_heap>, immer::no_refcount_policy, immer::gc_transience_policy, false>; | ||||||
|  | using basic_memory  = immer::memory_policy<immer::heap_policy<immer::cpp_heap>, immer::refcount_policy>; | ||||||
|  | using safe_memory   = immer::memory_policy<immer::free_list_heap_policy<immer::cpp_heap>, immer::refcount_policy>; | ||||||
|  | using unsafe_memory = immer::memory_policy<immer::unsafe_free_list_heap_policy<immer::cpp_heap>, immer::unsafe_refcount_policy>; | ||||||
|  | 
 | ||||||
|  | } // anonymous namespace
 | ||||||
							
								
								
									
										146
									
								
								third_party/immer/benchmark/extra/refcounting.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								third_party/immer/benchmark/extra/refcounting.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,146 @@ | ||||||
|  | //
 | ||||||
|  | // 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 <immer/detail/ref_count_base.hpp> | ||||||
|  | 
 | ||||||
|  | #include <nonius.h++> | ||||||
|  | #include <boost/intrusive_ptr.hpp> | ||||||
|  | 
 | ||||||
|  | #include <atomic> | ||||||
|  | #include <cstdlib> | ||||||
|  | #include <iterator> | ||||||
|  | #include <memory> | ||||||
|  | #include <utility> | ||||||
|  | #include <array> | ||||||
|  | #include <vector> | ||||||
|  | 
 | ||||||
|  | NONIUS_PARAM(N, std::size_t{1000}) | ||||||
|  | 
 | ||||||
|  | constexpr auto benchmark_size = 32u; | ||||||
|  | 
 | ||||||
|  | struct object_t : immer::detail::ref_count_base<object_t> | ||||||
|  | {}; | ||||||
|  | 
 | ||||||
|  | auto make_data() | ||||||
|  | { | ||||||
|  |     auto objs = std::array<std::unique_ptr<object_t>, benchmark_size>(); | ||||||
|  |     std::generate(objs.begin(), objs.end(), [] { | ||||||
|  |         return std::make_unique<object_t>(); | ||||||
|  |     }); | ||||||
|  |     auto refs = std::array<object_t*, benchmark_size>(); | ||||||
|  |     std::transform(objs.begin(), objs.end(), refs.begin(), [](auto& obj) { | ||||||
|  |         return obj.get(); | ||||||
|  |     }); | ||||||
|  |     return make_pair(std::move(objs), | ||||||
|  |                      std::move(refs)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("intrusive_ptr", [] (nonius::chronometer meter) | ||||||
|  | { | ||||||
|  |     auto arr     = std::array<boost::intrusive_ptr<object_t>, benchmark_size>{}; | ||||||
|  |     auto storage = std::vector< | ||||||
|  |         nonius::storage_for< | ||||||
|  |             std::array<boost::intrusive_ptr<object_t>, benchmark_size>>> ( | ||||||
|  |                 meter.runs()); | ||||||
|  |     std::generate(arr.begin(), arr.end(), [] { | ||||||
|  |         return new object_t{}; | ||||||
|  |     }); | ||||||
|  |     meter.measure([&] (int i) { | ||||||
|  |         storage[i].construct(arr); | ||||||
|  |     }); | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("generic", [] (nonius::chronometer meter) | ||||||
|  | { | ||||||
|  |     auto data = make_data(); | ||||||
|  |     auto& refs = data.second; | ||||||
|  |     object_t* r[benchmark_size]; | ||||||
|  | 
 | ||||||
|  |     meter.measure([&] { | ||||||
|  |         std::transform(refs.begin(), refs.end(), r, [] (auto& p) { | ||||||
|  |             if (p) p->ref_count.fetch_add(1, std::memory_order_relaxed); | ||||||
|  |             return p; | ||||||
|  |         }); | ||||||
|  |         return r; | ||||||
|  |     }); | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("manual", [] (nonius::chronometer meter) | ||||||
|  | { | ||||||
|  |     auto data = make_data(); | ||||||
|  |     auto& refs = data.second; | ||||||
|  |     object_t* r[benchmark_size]; | ||||||
|  | 
 | ||||||
|  |     meter.measure([&] { | ||||||
|  |         for (auto& p : refs) | ||||||
|  |             if (p) p->ref_count.fetch_add(1, std::memory_order_relaxed); | ||||||
|  |         std::copy(refs.begin(), refs.end(), r); | ||||||
|  |         return r; | ||||||
|  |     }); | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("manual - unroll", [] (nonius::chronometer meter) | ||||||
|  | { | ||||||
|  |     auto data = make_data(); | ||||||
|  |     auto& refs = data.second; | ||||||
|  |     object_t* r[benchmark_size]; | ||||||
|  | 
 | ||||||
|  |     meter.measure([&] { | ||||||
|  |         auto e = refs.end(); | ||||||
|  |         for (auto p = refs.begin(); p != e;) { | ||||||
|  |             (*p++)->ref_count.fetch_add(1, std::memory_order_relaxed); | ||||||
|  |             (*p++)->ref_count.fetch_add(1, std::memory_order_relaxed); | ||||||
|  |             (*p++)->ref_count.fetch_add(1, std::memory_order_relaxed); | ||||||
|  |             (*p++)->ref_count.fetch_add(1, std::memory_order_relaxed); | ||||||
|  |         } | ||||||
|  |         std::copy(refs.begin(), refs.end(), r); | ||||||
|  |         return r; | ||||||
|  |     }); | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("manual - nocheck", [] (nonius::chronometer meter) | ||||||
|  | { | ||||||
|  |     auto data = make_data(); | ||||||
|  |     auto& refs = data.second; | ||||||
|  |     object_t* r[benchmark_size]; | ||||||
|  | 
 | ||||||
|  |     meter.measure([&] { | ||||||
|  |         for (auto& p : refs) | ||||||
|  |             p->ref_count.fetch_add(1, std::memory_order_relaxed); | ||||||
|  |         std::copy(refs.begin(), refs.end(), r); | ||||||
|  |         return r; | ||||||
|  |     }); | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("manual - constant", [] (nonius::chronometer meter) | ||||||
|  | { | ||||||
|  |     auto data = make_data(); | ||||||
|  |     auto& refs = data.second; | ||||||
|  |     object_t* r[benchmark_size]; | ||||||
|  | 
 | ||||||
|  |     meter.measure([&] { | ||||||
|  |         for (auto i = 0u; i < benchmark_size; ++i) | ||||||
|  |             refs[i]->ref_count.fetch_add(1, std::memory_order_relaxed); | ||||||
|  |         std::copy(refs.begin(), refs.end(), r); | ||||||
|  |         return r; | ||||||
|  |     }); | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("manual - memcopy", [] (nonius::chronometer meter) | ||||||
|  | { | ||||||
|  |     auto data = make_data(); | ||||||
|  |     auto& refs = data.second; | ||||||
|  |     object_t* r[benchmark_size]; | ||||||
|  | 
 | ||||||
|  |     meter.measure([&] { | ||||||
|  |         for (auto& p : refs) | ||||||
|  |             if (p) p->ref_count.fetch_add(1, std::memory_order_relaxed); | ||||||
|  |         std::memcpy(r, &refs[0], sizeof(object_t*) * benchmark_size); | ||||||
|  |         return r; | ||||||
|  |     }); | ||||||
|  | }) | ||||||
							
								
								
									
										175
									
								
								third_party/immer/benchmark/set/access.hpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										175
									
								
								third_party/immer/benchmark/set/access.hpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,175 @@ | ||||||
|  | //
 | ||||||
|  | // 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
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include "benchmark/config.hpp" | ||||||
|  | 
 | ||||||
|  | #include <immer/set.hpp> | ||||||
|  | #include <hash_trie.hpp> // Phil Nash
 | ||||||
|  | #include <boost/container/flat_set.hpp> | ||||||
|  | #include <set> | ||||||
|  | #include <unordered_set> | ||||||
|  | 
 | ||||||
|  | namespace { | ||||||
|  | 
 | ||||||
|  | template <typename T=unsigned> | ||||||
|  | auto make_generator_ranged(std::size_t runs) | ||||||
|  | { | ||||||
|  |     assert(runs > 0); | ||||||
|  |     auto engine = std::default_random_engine{13}; | ||||||
|  |     auto dist = std::uniform_int_distribution<T>{0, (T)runs-1}; | ||||||
|  |     auto r = std::vector<T>(runs); | ||||||
|  |     std::generate_n(r.begin(), runs, std::bind(dist, engine)); | ||||||
|  |     return r; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Generator, typename Set> | ||||||
|  | auto benchmark_access_std() | ||||||
|  | { | ||||||
|  |     return [] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n  = meter.param<N>(); | ||||||
|  |         auto g1 = Generator{}(n); | ||||||
|  |         auto g2 = make_generator_ranged(n); | ||||||
|  | 
 | ||||||
|  |         auto v = Set{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v.insert(g1[i]); | ||||||
|  | 
 | ||||||
|  |         measure(meter, [&] { | ||||||
|  |             auto c = 0u; | ||||||
|  |             for (auto i = 0u; i < n; ++i) | ||||||
|  |                 c += v.count(g1[g2[i]]); | ||||||
|  |             volatile auto r = c; | ||||||
|  |             return r; | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Generator, typename Set> | ||||||
|  | auto benchmark_access_hamt() | ||||||
|  | { | ||||||
|  |     return [] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  |         auto g1 = Generator{}(n); | ||||||
|  |         auto g2 = make_generator_ranged(n); | ||||||
|  | 
 | ||||||
|  |         auto v = Set{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v.insert(g1[i]); | ||||||
|  | 
 | ||||||
|  |         measure(meter, [&] { | ||||||
|  |             auto c = 0u; | ||||||
|  |             for (auto i = 0u; i < n; ++i) { | ||||||
|  |                 auto& x = g1[g2[i]]; | ||||||
|  |                 auto leaf = v.find(x).leaf(); | ||||||
|  |                 c += !!(leaf && leaf->find(x)); | ||||||
|  |             } | ||||||
|  |             volatile auto r = c; | ||||||
|  |             return r; | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | template <typename Generator, typename Set> | ||||||
|  | auto benchmark_access() | ||||||
|  | { | ||||||
|  |     return [] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  |         auto g1 = Generator{}(n); | ||||||
|  |         auto g2 = make_generator_ranged(n); | ||||||
|  | 
 | ||||||
|  |         auto v = Set{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v = v.insert(g1[i]); | ||||||
|  | 
 | ||||||
|  |         measure(meter, [&] { | ||||||
|  |             auto c = 0u; | ||||||
|  |             for (auto i = 0u; i < n; ++i) | ||||||
|  |                 c += v.count(g1[g2[i]]); | ||||||
|  |             volatile auto r = c; | ||||||
|  |             return r; | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Generator, typename Set> | ||||||
|  | auto benchmark_bad_access_std() | ||||||
|  | { | ||||||
|  |     return [] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  |         auto g1 = Generator{}(n*2); | ||||||
|  | 
 | ||||||
|  |         auto v = Set{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v.insert(g1[i]); | ||||||
|  | 
 | ||||||
|  |         measure(meter, [&] { | ||||||
|  |             auto c = 0u; | ||||||
|  |             for (auto i = 0u; i < n; ++i) | ||||||
|  |                 c += v.count(g1[n+i]); | ||||||
|  |             volatile auto r = c; | ||||||
|  |             return r; | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Generator, typename Set> | ||||||
|  | auto benchmark_bad_access_hamt() | ||||||
|  | { | ||||||
|  |     return [] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  |         auto g1 = Generator{}(n*2); | ||||||
|  | 
 | ||||||
|  |         auto v = Set{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v.insert(g1[i]); | ||||||
|  | 
 | ||||||
|  |         measure(meter, [&] { | ||||||
|  |             auto c = 0u; | ||||||
|  |             for (auto i = 0u; i < n; ++i) { | ||||||
|  |                 auto& x = g1[n+i]; | ||||||
|  |                 auto leaf = v.find(x).leaf(); | ||||||
|  |                 c += !!(leaf && leaf->find(x)); | ||||||
|  |             } | ||||||
|  |             volatile auto r = c; | ||||||
|  |             return r; | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | template <typename Generator, typename Set> | ||||||
|  | auto benchmark_bad_access() | ||||||
|  | { | ||||||
|  |     return [] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  |         auto g1 = Generator{}(n*2); | ||||||
|  | 
 | ||||||
|  |         auto v = Set{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v = v.insert(g1[i]); | ||||||
|  | 
 | ||||||
|  |         measure(meter, [&] { | ||||||
|  |             auto c = 0u; | ||||||
|  |             for (auto i = 0u; i < n; ++i) | ||||||
|  |                 c += v.count(g1[n+i]); | ||||||
|  |             volatile auto r = c; | ||||||
|  |             return r; | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | } // namespace
 | ||||||
							
								
								
									
										30
									
								
								third_party/immer/benchmark/set/access.ipp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								third_party/immer/benchmark/set/access.ipp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,30 @@ | ||||||
|  | // | ||||||
|  | // 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 "access.hpp" | ||||||
|  | 
 | ||||||
|  | #ifndef GENERATOR_T | ||||||
|  | #error "you must define a GENERATOR_T" | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | using generator__ = GENERATOR_T; | ||||||
|  | using t__ = typename decltype(generator__{}(0))::value_type; | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("std::set", benchmark_access_std<generator__, std::set<t__>>()) | ||||||
|  | NONIUS_BENCHMARK("std::unordered_set", benchmark_access_std<generator__, std::unordered_set<t__>>()) | ||||||
|  | NONIUS_BENCHMARK("boost::flat_set", benchmark_access_std<generator__, boost::container::flat_set<t__>>()) | ||||||
|  | NONIUS_BENCHMARK("hamt::hash_trie", benchmark_access_hamt<generator__, hamt::hash_trie<t__>>()) | ||||||
|  | NONIUS_BENCHMARK("immer::set/5B", benchmark_access<generator__, immer::set<t__, std::hash<t__>,std::equal_to<t__>,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("immer::set/4B", benchmark_access<generator__, immer::set<t__, std::hash<t__>,std::equal_to<t__>,def_memory,4>>()) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("bad/std::set", benchmark_bad_access_std<generator__, std::set<t__>>()) | ||||||
|  | NONIUS_BENCHMARK("bad/std::unordered_set", benchmark_bad_access_std<generator__, std::unordered_set<t__>>()) | ||||||
|  | NONIUS_BENCHMARK("bad/boost::flat_set", benchmark_bad_access_std<generator__, boost::container::flat_set<t__>>()) | ||||||
|  | NONIUS_BENCHMARK("bad/hamt::hash_trie", benchmark_bad_access_hamt<generator__, hamt::hash_trie<t__>>()) | ||||||
|  | NONIUS_BENCHMARK("bad/immer::set/5B", benchmark_bad_access<generator__, immer::set<t__, std::hash<t__>,std::equal_to<t__>,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("bad/immer::set/4B", benchmark_bad_access<generator__, immer::set<t__, std::hash<t__>,std::equal_to<t__>,def_memory,4>>()) | ||||||
							
								
								
									
										55
									
								
								third_party/immer/benchmark/set/insert.hpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								third_party/immer/benchmark/set/insert.hpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,55 @@ | ||||||
|  | //
 | ||||||
|  | // 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
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include "benchmark/config.hpp" | ||||||
|  | 
 | ||||||
|  | #include <immer/set.hpp> | ||||||
|  | #include <hash_trie.hpp> // Phil Nash
 | ||||||
|  | #include <boost/container/flat_set.hpp> | ||||||
|  | #include <set> | ||||||
|  | #include <unordered_set> | ||||||
|  | 
 | ||||||
|  | namespace { | ||||||
|  | 
 | ||||||
|  | template <typename Generator, typename Set> | ||||||
|  | auto benchmark_insert_mut_std() | ||||||
|  | { | ||||||
|  |     return [] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  |         auto g = Generator{}(n); | ||||||
|  | 
 | ||||||
|  |         measure(meter, [&] { | ||||||
|  |             auto v = Set{}; | ||||||
|  |             for (auto i = 0u; i < n; ++i) | ||||||
|  |                 v.insert(g[i]); | ||||||
|  |             return v; | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Generator, typename Set> | ||||||
|  | auto benchmark_insert() | ||||||
|  | { | ||||||
|  |     return [] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  |         auto g = Generator{}(n); | ||||||
|  | 
 | ||||||
|  |         measure(meter, [&] { | ||||||
|  |             auto v = Set{}; | ||||||
|  |             for (auto i = 0u; i < n; ++i) | ||||||
|  |                 v = v.insert(g[i]); | ||||||
|  |             return v; | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | } // namespace
 | ||||||
							
								
								
									
										28
									
								
								third_party/immer/benchmark/set/insert.ipp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								third_party/immer/benchmark/set/insert.ipp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,28 @@ | ||||||
|  | // | ||||||
|  | // 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 "insert.hpp" | ||||||
|  | 
 | ||||||
|  | #ifndef GENERATOR_T | ||||||
|  | #error "you must define a GENERATOR_T" | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | using generator__ = GENERATOR_T; | ||||||
|  | using t__ = typename decltype(generator__{}(0))::value_type; | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("std::set", benchmark_insert_mut_std<generator__, std::set<t__>>()) | ||||||
|  | NONIUS_BENCHMARK("std::unordered_set", benchmark_insert_mut_std<generator__, std::unordered_set<t__>>()) | ||||||
|  | NONIUS_BENCHMARK("boost::flat_set", benchmark_insert_mut_std<generator__, boost::container::flat_set<t__>>()) | ||||||
|  | NONIUS_BENCHMARK("hamt::hash_trie", benchmark_insert_mut_std<generator__, hamt::hash_trie<t__>>()) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("immer::set/5B", benchmark_insert<generator__, immer::set<t__, std::hash<t__>,std::equal_to<t__>,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("immer::set/4B", benchmark_insert<generator__, immer::set<t__, std::hash<t__>,std::equal_to<t__>,def_memory,4>>()) | ||||||
|  | #ifndef DISABLE_GC_BENCHMARKS | ||||||
|  | NONIUS_BENCHMARK("immer::set/GC", benchmark_insert<generator__, immer::set<t__, std::hash<t__>,std::equal_to<t__>,gc_memory,5>>()) | ||||||
|  | #endif | ||||||
|  | NONIUS_BENCHMARK("immer::set/UN", benchmark_insert<generator__, immer::set<t__, std::hash<t__>,std::equal_to<t__>,unsafe_memory,5>>()) | ||||||
							
								
								
									
										111
									
								
								third_party/immer/benchmark/set/iter.hpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										111
									
								
								third_party/immer/benchmark/set/iter.hpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,111 @@ | ||||||
|  | //
 | ||||||
|  | // 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
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include "benchmark/config.hpp" | ||||||
|  | 
 | ||||||
|  | #include <immer/set.hpp> | ||||||
|  | #include <immer/box.hpp> | ||||||
|  | #include <immer/algorithm.hpp> | ||||||
|  | #include <hash_trie.hpp> // Phil Nash
 | ||||||
|  | #include <boost/container/flat_set.hpp> | ||||||
|  | #include <set> | ||||||
|  | #include <unordered_set> | ||||||
|  | #include <numeric> | ||||||
|  | 
 | ||||||
|  | namespace { | ||||||
|  | 
 | ||||||
|  | template <typename T> | ||||||
|  | struct iter_step | ||||||
|  | { | ||||||
|  |     unsigned operator() (unsigned x, const T& y) const | ||||||
|  |     { | ||||||
|  |         return x + y; | ||||||
|  |     } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | template <> | ||||||
|  | struct iter_step<std::string> | ||||||
|  | { | ||||||
|  |     unsigned operator() (unsigned x, const std::string& y) const | ||||||
|  |     { | ||||||
|  |         return x + (unsigned) y.size(); | ||||||
|  |     } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | template <> | ||||||
|  | struct iter_step<immer::box<std::string>> | ||||||
|  | { | ||||||
|  |     unsigned operator() (unsigned x, const immer::box<std::string>& y) const | ||||||
|  |     { | ||||||
|  |         return x + (unsigned) y->size(); | ||||||
|  |     } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | template <typename Generator, typename Set> | ||||||
|  | auto benchmark_access_std_iter() | ||||||
|  | { | ||||||
|  |     return [] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n  = meter.param<N>(); | ||||||
|  |         auto g1 = Generator{}(n); | ||||||
|  | 
 | ||||||
|  |         auto v = Set{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v.insert(g1[i]); | ||||||
|  | 
 | ||||||
|  |         using step_t = iter_step<typename decltype(g1)::value_type>; | ||||||
|  |         measure(meter, [&] { | ||||||
|  |             volatile auto c = std::accumulate(v.begin(), v.end(), 0u, step_t{}); | ||||||
|  |             return c; | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Generator, typename Set> | ||||||
|  | auto benchmark_access_reduce() | ||||||
|  | { | ||||||
|  |     return [] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  |         auto g1 = Generator{}(n); | ||||||
|  | 
 | ||||||
|  |         auto v = Set{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v = v.insert(g1[i]); | ||||||
|  | 
 | ||||||
|  |         using step_t = iter_step<typename decltype(g1)::value_type>; | ||||||
|  |         measure(meter, [&] { | ||||||
|  |             volatile auto c = immer::accumulate(v, 0u, step_t{}); | ||||||
|  |             return c; | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Generator, typename Set> | ||||||
|  | auto benchmark_access_iter() | ||||||
|  | { | ||||||
|  |     return [] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  |         auto g1 = Generator{}(n); | ||||||
|  | 
 | ||||||
|  |         auto v = Set{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v = v.insert(g1[i]); | ||||||
|  | 
 | ||||||
|  |         using step_t = iter_step<typename decltype(g1)::value_type>; | ||||||
|  |         measure(meter, [&] { | ||||||
|  |             volatile auto c = std::accumulate(v.begin(), v.end(), 0u, step_t{}); | ||||||
|  |             return c; | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | } // namespace
 | ||||||
							
								
								
									
										25
									
								
								third_party/immer/benchmark/set/iter.ipp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								third_party/immer/benchmark/set/iter.ipp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | ||||||
|  | // | ||||||
|  | // 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 "iter.hpp" | ||||||
|  | 
 | ||||||
|  | #ifndef GENERATOR_T | ||||||
|  | #error "you must define a GENERATOR_T" | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | using generator__ = GENERATOR_T; | ||||||
|  | using t__ = typename decltype(generator__{}(0))::value_type; | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("iter/std::set", benchmark_access_std_iter<generator__, std::set<t__>>()) | ||||||
|  | NONIUS_BENCHMARK("iter/std::unordered_set", benchmark_access_std_iter<generator__, std::unordered_set<t__>>()) | ||||||
|  | NONIUS_BENCHMARK("iter/boost::flat_set", benchmark_access_std_iter<generator__, boost::container::flat_set<t__>>()) | ||||||
|  | NONIUS_BENCHMARK("iter/hamt::hash_trie", benchmark_access_std_iter<generator__, hamt::hash_trie<t__>>()) | ||||||
|  | NONIUS_BENCHMARK("iter/immer::set/5B", benchmark_access_iter<generator__, immer::set<t__, std::hash<t__>,std::equal_to<t__>,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("iter/immer::set/4B", benchmark_access_iter<generator__, immer::set<t__, std::hash<t__>,std::equal_to<t__>,def_memory,4>>()) | ||||||
|  | NONIUS_BENCHMARK("reduce/immer::set/5B", benchmark_access_reduce<generator__, immer::set<t__, std::hash<t__>,std::equal_to<t__>,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("reduce/immer::set/4B", benchmark_access_reduce<generator__, immer::set<t__, std::hash<t__>,std::equal_to<t__>,def_memory,4>>()) | ||||||
							
								
								
									
										10
									
								
								third_party/immer/benchmark/set/string-box/access.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								third_party/immer/benchmark/set/string-box/access.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | //
 | ||||||
|  | // 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 "generator.ipp" | ||||||
|  | #include "../access.ipp" | ||||||
							
								
								
									
										46
									
								
								third_party/immer/benchmark/set/string-box/generator.ipp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								third_party/immer/benchmark/set/string-box/generator.ipp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,46 @@ | ||||||
|  | // | ||||||
|  | // 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 <immer/box.hpp> | ||||||
|  | 
 | ||||||
|  | #include <random> | ||||||
|  | #include <vector> | ||||||
|  | #include <cassert> | ||||||
|  | #include <functional> | ||||||
|  | #include <algorithm> | ||||||
|  | 
 | ||||||
|  | #define GENERATOR_T generate_unsigned | ||||||
|  | 
 | ||||||
|  | namespace { | ||||||
|  | 
 | ||||||
|  | struct GENERATOR_T | ||||||
|  | { | ||||||
|  |     static constexpr auto char_set   = "_-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; | ||||||
|  |     static constexpr auto max_length = 64; | ||||||
|  |     static constexpr auto min_length = 8; | ||||||
|  | 
 | ||||||
|  |     auto operator() (std::size_t runs) const | ||||||
|  |     { | ||||||
|  |         assert(runs > 0); | ||||||
|  |         auto engine = std::default_random_engine{42}; | ||||||
|  |         auto dist = std::uniform_int_distribution<unsigned>{}; | ||||||
|  |         auto gen = std::bind(dist, engine); | ||||||
|  |         auto r = std::vector<immer::box<std::string>>(runs); | ||||||
|  |         std::generate_n(r.begin(), runs, [&] { | ||||||
|  |             auto len = gen() % (max_length - min_length) + min_length; | ||||||
|  |             auto str = std::string(len, ' '); | ||||||
|  |             std::generate_n(str.begin(), len, [&] { | ||||||
|  |                 return char_set[gen() % sizeof(char_set)]; | ||||||
|  |             }); | ||||||
|  |             return str; | ||||||
|  |         }); | ||||||
|  |         return r; | ||||||
|  |     } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } // namespace | ||||||
							
								
								
									
										11
									
								
								third_party/immer/benchmark/set/string-box/insert.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								third_party/immer/benchmark/set/string-box/insert.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,11 @@ | ||||||
|  | //
 | ||||||
|  | // 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
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #define DISABLE_GC_BENCHMARKS | ||||||
|  | #include "generator.ipp" | ||||||
|  | #include "../insert.ipp" | ||||||
							
								
								
									
										10
									
								
								third_party/immer/benchmark/set/string-box/iter.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								third_party/immer/benchmark/set/string-box/iter.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | //
 | ||||||
|  | // 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 "generator.ipp" | ||||||
|  | #include "../iter.ipp" | ||||||
							
								
								
									
										10
									
								
								third_party/immer/benchmark/set/string-long/access.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								third_party/immer/benchmark/set/string-long/access.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | //
 | ||||||
|  | // 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 "generator.ipp" | ||||||
|  | #include "../access.ipp" | ||||||
							
								
								
									
										44
									
								
								third_party/immer/benchmark/set/string-long/generator.ipp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								third_party/immer/benchmark/set/string-long/generator.ipp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,44 @@ | ||||||
|  | // | ||||||
|  | // 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 <random> | ||||||
|  | #include <vector> | ||||||
|  | #include <cassert> | ||||||
|  | #include <functional> | ||||||
|  | #include <algorithm> | ||||||
|  | 
 | ||||||
|  | #define GENERATOR_T generate_unsigned | ||||||
|  | 
 | ||||||
|  | namespace { | ||||||
|  | 
 | ||||||
|  | struct GENERATOR_T | ||||||
|  | { | ||||||
|  |     static constexpr auto char_set   = "_-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; | ||||||
|  |     static constexpr auto max_length = 256; | ||||||
|  |     static constexpr auto min_length = 32; | ||||||
|  | 
 | ||||||
|  |     auto operator() (std::size_t runs) const | ||||||
|  |     { | ||||||
|  |         assert(runs > 0); | ||||||
|  |         auto engine = std::default_random_engine{42}; | ||||||
|  |         auto dist = std::uniform_int_distribution<unsigned>{}; | ||||||
|  |         auto gen = std::bind(dist, engine); | ||||||
|  |         auto r = std::vector<std::string>(runs); | ||||||
|  |         std::generate_n(r.begin(), runs, [&] { | ||||||
|  |             auto len = gen() % (max_length - min_length) + min_length; | ||||||
|  |             auto str = std::string(len, ' '); | ||||||
|  |             std::generate_n(str.begin(), len, [&] { | ||||||
|  |                 return char_set[gen() % sizeof(char_set)]; | ||||||
|  |             }); | ||||||
|  |             return str; | ||||||
|  |         }); | ||||||
|  |         return r; | ||||||
|  |     } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } // namespace | ||||||
							
								
								
									
										11
									
								
								third_party/immer/benchmark/set/string-long/insert.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								third_party/immer/benchmark/set/string-long/insert.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,11 @@ | ||||||
|  | //
 | ||||||
|  | // 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
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #define DISABLE_GC_BENCHMARKS | ||||||
|  | #include "generator.ipp" | ||||||
|  | #include "../insert.ipp" | ||||||
							
								
								
									
										10
									
								
								third_party/immer/benchmark/set/string-long/iter.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								third_party/immer/benchmark/set/string-long/iter.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | //
 | ||||||
|  | // 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 "generator.ipp" | ||||||
|  | #include "../iter.ipp" | ||||||
							
								
								
									
										10
									
								
								third_party/immer/benchmark/set/string-short/access.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								third_party/immer/benchmark/set/string-short/access.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | //
 | ||||||
|  | // 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 "generator.ipp" | ||||||
|  | #include "../access.ipp" | ||||||
							
								
								
									
										44
									
								
								third_party/immer/benchmark/set/string-short/generator.ipp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								third_party/immer/benchmark/set/string-short/generator.ipp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,44 @@ | ||||||
|  | // | ||||||
|  | // 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 <random> | ||||||
|  | #include <vector> | ||||||
|  | #include <cassert> | ||||||
|  | #include <functional> | ||||||
|  | #include <algorithm> | ||||||
|  | 
 | ||||||
|  | #define GENERATOR_T generate_unsigned | ||||||
|  | 
 | ||||||
|  | namespace { | ||||||
|  | 
 | ||||||
|  | struct GENERATOR_T | ||||||
|  | { | ||||||
|  |     static constexpr auto char_set   = "_-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; | ||||||
|  |     static constexpr auto max_length = 15; | ||||||
|  |     static constexpr auto min_length = 4; | ||||||
|  | 
 | ||||||
|  |     auto operator() (std::size_t runs) const | ||||||
|  |     { | ||||||
|  |         assert(runs > 0); | ||||||
|  |         auto engine = std::default_random_engine{42}; | ||||||
|  |         auto dist = std::uniform_int_distribution<unsigned>{}; | ||||||
|  |         auto gen = std::bind(dist, engine); | ||||||
|  |         auto r = std::vector<std::string>(runs); | ||||||
|  |         std::generate_n(r.begin(), runs, [&] { | ||||||
|  |             auto len = gen() % (max_length - min_length) + min_length; | ||||||
|  |             auto str = std::string(len, ' '); | ||||||
|  |             std::generate_n(str.begin(), len, [&] { | ||||||
|  |                 return char_set[gen() % sizeof(char_set)]; | ||||||
|  |             }); | ||||||
|  |             return str; | ||||||
|  |         }); | ||||||
|  |         return r; | ||||||
|  |     } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } // namespace | ||||||
							
								
								
									
										10
									
								
								third_party/immer/benchmark/set/string-short/insert.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								third_party/immer/benchmark/set/string-short/insert.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | //
 | ||||||
|  | // 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 "generator.ipp" | ||||||
|  | #include "../insert.ipp" | ||||||
							
								
								
									
										10
									
								
								third_party/immer/benchmark/set/string-short/iter.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								third_party/immer/benchmark/set/string-short/iter.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | //
 | ||||||
|  | // 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 "generator.ipp" | ||||||
|  | #include "../iter.ipp" | ||||||
							
								
								
									
										10
									
								
								third_party/immer/benchmark/set/unsigned/access.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								third_party/immer/benchmark/set/unsigned/access.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | //
 | ||||||
|  | // 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 "generator.ipp" | ||||||
|  | #include "../access.ipp" | ||||||
							
								
								
									
										32
									
								
								third_party/immer/benchmark/set/unsigned/generator.ipp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								third_party/immer/benchmark/set/unsigned/generator.ipp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,32 @@ | ||||||
|  | // | ||||||
|  | // 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 <random> | ||||||
|  | #include <vector> | ||||||
|  | #include <cassert> | ||||||
|  | #include <functional> | ||||||
|  | #include <algorithm> | ||||||
|  | 
 | ||||||
|  | #define GENERATOR_T generate_unsigned | ||||||
|  | 
 | ||||||
|  | namespace { | ||||||
|  | 
 | ||||||
|  | struct GENERATOR_T | ||||||
|  | { | ||||||
|  |     auto operator() (std::size_t runs) const | ||||||
|  |     { | ||||||
|  |         assert(runs > 0); | ||||||
|  |         auto engine = std::default_random_engine{42}; | ||||||
|  |         auto dist = std::uniform_int_distribution<unsigned>{}; | ||||||
|  |         auto r = std::vector<unsigned>(runs); | ||||||
|  |         std::generate_n(r.begin(), runs, std::bind(dist, engine)); | ||||||
|  |         return r; | ||||||
|  |     } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } // namespace | ||||||
							
								
								
									
										10
									
								
								third_party/immer/benchmark/set/unsigned/insert.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								third_party/immer/benchmark/set/unsigned/insert.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | //
 | ||||||
|  | // 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 "generator.ipp" | ||||||
|  | #include "../insert.ipp" | ||||||
							
								
								
									
										10
									
								
								third_party/immer/benchmark/set/unsigned/iter.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								third_party/immer/benchmark/set/unsigned/iter.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | //
 | ||||||
|  | // 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 "generator.ipp" | ||||||
|  | #include "../iter.ipp" | ||||||
							
								
								
									
										261
									
								
								third_party/immer/benchmark/vector/access.hpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										261
									
								
								third_party/immer/benchmark/vector/access.hpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,261 @@ | ||||||
|  | //
 | ||||||
|  | // 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
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include "benchmark/vector/common.hpp" | ||||||
|  | 
 | ||||||
|  | #include <immer/algorithm.hpp> | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_BOOST_COROUTINE | ||||||
|  | #include <boost/coroutine2/all.hpp> | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | namespace { | ||||||
|  | 
 | ||||||
|  | template <typename Vektor> | ||||||
|  | auto benchmark_access_reduce_chunkedseq() | ||||||
|  | { | ||||||
|  |     return [] (nonius::parameters params) | ||||||
|  |     { | ||||||
|  |         auto n = params.get<N>(); | ||||||
|  |         auto v = Vektor{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v.push_back(i); | ||||||
|  |         return [=] { | ||||||
|  |             auto init = 0u; | ||||||
|  |             v.for_each_segment([&] (auto first, auto last) { | ||||||
|  |                 init = std::accumulate(first, last, init); | ||||||
|  |             }); | ||||||
|  |             return init; | ||||||
|  |         }; | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Vektor> | ||||||
|  | auto benchmark_access_iter_std() | ||||||
|  | { | ||||||
|  |     return [] (nonius::parameters params) | ||||||
|  |     { | ||||||
|  |         auto n = params.get<N>(); | ||||||
|  |         auto v = Vektor{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v.push_back(i); | ||||||
|  |         return [=] { | ||||||
|  |             auto volatile x = std::accumulate(v.begin(), v.end(), 0u); | ||||||
|  |             return x; | ||||||
|  |         }; | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Vektor> | ||||||
|  | auto benchmark_access_idx_std() | ||||||
|  | { | ||||||
|  |     return [] (nonius::parameters params) | ||||||
|  |     { | ||||||
|  |         auto n = params.get<N>(); | ||||||
|  |         auto v = Vektor{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v.push_back(i); | ||||||
|  |         return [=] { | ||||||
|  |             auto r = 0u; | ||||||
|  |             for (auto i = 0u; i < n; ++i) | ||||||
|  |                 r += v[i]; | ||||||
|  |             volatile auto rr = r; | ||||||
|  |             return rr; | ||||||
|  |         }; | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Vektor> | ||||||
|  | auto benchmark_access_random_std() | ||||||
|  | { | ||||||
|  |     return [] (nonius::parameters params) | ||||||
|  |     { | ||||||
|  |         auto n = params.get<N>(); | ||||||
|  |         auto v = Vektor{}; | ||||||
|  |         auto g = make_generator(n); | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v.push_back(i); | ||||||
|  |         return [=] { | ||||||
|  |             auto r = 0u; | ||||||
|  |             for (auto i = 0u; i < n; ++i) | ||||||
|  |                 r += v[g[i]]; | ||||||
|  |             volatile auto rr = r; | ||||||
|  |             return rr; | ||||||
|  |         }; | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Vektor, typename PushFn=push_back_fn> | ||||||
|  | auto benchmark_access_iter() | ||||||
|  | { | ||||||
|  |     return [] (nonius::parameters params) | ||||||
|  |     { | ||||||
|  |         auto n = params.get<N>(); | ||||||
|  | 
 | ||||||
|  |         auto v = Vektor{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v = PushFn{}(std::move(v), i); | ||||||
|  | 
 | ||||||
|  |         return [=] { | ||||||
|  |             auto volatile x = std::accumulate(v.begin(), v.end(), 0u); | ||||||
|  |             return x; | ||||||
|  |         }; | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_BOOST_COROUTINE | ||||||
|  | template <typename Vektor, typename PushFn=push_back_fn> | ||||||
|  | auto benchmark_access_coro() | ||||||
|  | { | ||||||
|  |     return [] (nonius::parameters params) | ||||||
|  |     { | ||||||
|  |         using coro_t = typename boost::coroutines2::coroutine<int>; | ||||||
|  | 
 | ||||||
|  |         auto n = params.get<N>(); | ||||||
|  | 
 | ||||||
|  |         auto v = Vektor{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v = PushFn{}(std::move(v), i); | ||||||
|  | 
 | ||||||
|  |         return [=] { | ||||||
|  |             auto c = coro_t::pull_type { [&](auto& sink) { | ||||||
|  |                 v.for_each_chunk([&](auto f, auto l) { | ||||||
|  |                     for (; f != l; ++f) | ||||||
|  |                         sink(*f); | ||||||
|  |                 }); | ||||||
|  |             }}; | ||||||
|  |             auto volatile x = std::accumulate(begin(c), end(c), 0u); | ||||||
|  |             return x; | ||||||
|  |         }; | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | template <typename Vektor, | ||||||
|  |           typename PushFn=push_back_fn> | ||||||
|  | auto benchmark_access_idx() | ||||||
|  | { | ||||||
|  |     return [] (nonius::parameters params) | ||||||
|  |     { | ||||||
|  |         auto n = params.get<N>(); | ||||||
|  | 
 | ||||||
|  |         auto v = Vektor{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v = PushFn{}(std::move(v), i); | ||||||
|  | 
 | ||||||
|  |         return [=] { | ||||||
|  |             auto r = 0u; | ||||||
|  |             for (auto i = 0u; i < n; ++i) | ||||||
|  |                 r += v[i]; | ||||||
|  |             volatile auto rr = r; | ||||||
|  |             return rr; | ||||||
|  |         }; | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Vektor, | ||||||
|  |           typename PushFn=push_back_fn> | ||||||
|  | auto benchmark_access_reduce() | ||||||
|  | { | ||||||
|  |     return [] (nonius::parameters params) | ||||||
|  |     { | ||||||
|  |         auto n = params.get<N>(); | ||||||
|  | 
 | ||||||
|  |         auto v = Vektor{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v = PushFn{}(std::move(v), i); | ||||||
|  | 
 | ||||||
|  |         return [=] { | ||||||
|  |             auto volatile x = immer::accumulate(v, 0u); | ||||||
|  |             return x; | ||||||
|  |         }; | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Vektor, | ||||||
|  |           typename PushFn=push_back_fn> | ||||||
|  | auto benchmark_access_reduce_range() | ||||||
|  | { | ||||||
|  |     return [] (nonius::parameters params) | ||||||
|  |     { | ||||||
|  |         auto n = params.get<N>(); | ||||||
|  | 
 | ||||||
|  |         auto v = Vektor{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v = PushFn{}(std::move(v), i); | ||||||
|  | 
 | ||||||
|  |         return [=] { | ||||||
|  |             auto volatile x = immer::accumulate(v.begin(), v.end(), 0u); | ||||||
|  |             return x; | ||||||
|  |         }; | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Vektor, | ||||||
|  |           typename PushFn=push_back_fn> | ||||||
|  | auto benchmark_access_random() | ||||||
|  | { | ||||||
|  |     return [] (nonius::parameters params) | ||||||
|  |     { | ||||||
|  |         auto n = params.get<N>(); | ||||||
|  | 
 | ||||||
|  |         auto v = Vektor{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v = PushFn{}(std::move(v), i); | ||||||
|  |         auto g = make_generator(n); | ||||||
|  | 
 | ||||||
|  |         return [=] { | ||||||
|  |             auto r = 0u; | ||||||
|  |             for (auto i = 0u; i < n; ++i) | ||||||
|  |                 r += v[g[i]]; | ||||||
|  |             volatile auto rr = r; | ||||||
|  |             return rr; | ||||||
|  |         }; | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Fn> | ||||||
|  | auto benchmark_access_librrb(Fn maker) | ||||||
|  | { | ||||||
|  |     return | ||||||
|  |         [=] (nonius::parameters params) { | ||||||
|  |             auto n = params.get<N>(); | ||||||
|  |             auto v = maker(n); | ||||||
|  |             return | ||||||
|  |                 [=] { | ||||||
|  |                     auto r = 0u; | ||||||
|  |                     for (auto i = 0u; i < n; ++i) | ||||||
|  |                         r += reinterpret_cast<unsigned long>(rrb_nth(v, i)); | ||||||
|  |                     volatile auto rr = r; | ||||||
|  |                     return rr; | ||||||
|  |                 }; | ||||||
|  |         }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Fn> | ||||||
|  | auto benchmark_access_random_librrb(Fn maker) | ||||||
|  | { | ||||||
|  |     return | ||||||
|  |         [=] (nonius::parameters params) { | ||||||
|  |             auto n = params.get<N>(); | ||||||
|  |             auto v = maker(n); | ||||||
|  |             auto g = make_generator(n); | ||||||
|  |             return | ||||||
|  |                 [=] { | ||||||
|  |                     auto r = 0u; | ||||||
|  |                     for (auto i = 0u; i < n; ++i) | ||||||
|  |                         r += reinterpret_cast<unsigned long>(rrb_nth(v, g[i])); | ||||||
|  |                     volatile auto rr = r; | ||||||
|  |                     return rr; | ||||||
|  |                 }; | ||||||
|  |         }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | } // anonymous namespace
 | ||||||
							
								
								
									
										245
									
								
								third_party/immer/benchmark/vector/assoc.hpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										245
									
								
								third_party/immer/benchmark/vector/assoc.hpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,245 @@ | ||||||
|  | //
 | ||||||
|  | // 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
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include "benchmark/vector/common.hpp" | ||||||
|  | 
 | ||||||
|  | namespace { | ||||||
|  | 
 | ||||||
|  | template <typename Vektor> | ||||||
|  | auto benchmark_assoc_std() | ||||||
|  | { | ||||||
|  |     return | ||||||
|  |         [] (nonius::chronometer meter) | ||||||
|  |         { | ||||||
|  |             auto n = meter.param<N>(); | ||||||
|  |             auto v = Vektor(n, 0); | ||||||
|  |             std::iota(v.begin(), v.end(), 0u); | ||||||
|  |             auto all = std::vector<Vektor>(meter.runs(), v); | ||||||
|  |             meter.measure([&] (int iter) { | ||||||
|  |                 auto& r = all[iter]; | ||||||
|  |                 for (auto i = 0u; i < n; ++i) | ||||||
|  |                     r[i] = n - i; | ||||||
|  |                 return r; | ||||||
|  |             }); | ||||||
|  |         }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Vektor> | ||||||
|  | auto benchmark_assoc_random_std() | ||||||
|  | { | ||||||
|  |     return | ||||||
|  |         [](nonius::chronometer meter) | ||||||
|  |         { | ||||||
|  |             auto n = meter.param<N>(); | ||||||
|  |             auto g = make_generator(n); | ||||||
|  |             auto v = Vektor(n, 0); | ||||||
|  |             std::iota(v.begin(), v.end(), 0u); | ||||||
|  |             auto all = std::vector<Vektor>(meter.runs(), v); | ||||||
|  |             meter.measure([&] (int iter) { | ||||||
|  |                 auto& r = all[iter]; | ||||||
|  |                 for (auto i = 0u; i < n; ++i) | ||||||
|  |                     r[g[i]] = n - i; | ||||||
|  |                 return r; | ||||||
|  |             }); | ||||||
|  |         }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Vektor, | ||||||
|  |           typename PushFn=push_back_fn, | ||||||
|  |           typename SetFn=set_fn> | ||||||
|  | auto benchmark_assoc() | ||||||
|  | { | ||||||
|  |     return [] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  |         if (n > get_limit<Vektor>{}) | ||||||
|  |             nonius::skip(); | ||||||
|  | 
 | ||||||
|  |         auto v = Vektor{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v = PushFn{}(std::move(v), i); | ||||||
|  | 
 | ||||||
|  |         measure(meter, [&] { | ||||||
|  |             auto r = v; | ||||||
|  |             for (auto i = 0u; i < n; ++i) | ||||||
|  |                 r = SetFn{}(r, i, n - i); | ||||||
|  |             return r; | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Vektor, | ||||||
|  |           typename PushFn=push_back_fn> | ||||||
|  | auto benchmark_assoc_move() | ||||||
|  | { | ||||||
|  |     return [] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  |         if (n > get_limit<Vektor>{}) | ||||||
|  |             nonius::skip(); | ||||||
|  | 
 | ||||||
|  |         auto v = Vektor{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v = PushFn{}(std::move(v), i); | ||||||
|  | 
 | ||||||
|  |         measure(meter, [&] { | ||||||
|  |             auto r = v; | ||||||
|  |             for (auto i = 0u; i < n; ++i) | ||||||
|  |                 r = std::move(r).set(i, n - i); | ||||||
|  |             return r; | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Vektor, | ||||||
|  |           typename PushFn=push_back_fn, | ||||||
|  |           typename SetFn=set_fn> | ||||||
|  | auto benchmark_assoc_random() | ||||||
|  | { | ||||||
|  |     return [] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  |         if (n > get_limit<Vektor>{}) | ||||||
|  |             nonius::skip(); | ||||||
|  | 
 | ||||||
|  |         auto g = make_generator(n); | ||||||
|  |         auto v = Vektor{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v = PushFn{}(std::move(v), i); | ||||||
|  | 
 | ||||||
|  |         measure(meter, [&] { | ||||||
|  |             auto r = v; | ||||||
|  |             for (auto i = 0u; i < n; ++i) | ||||||
|  |                 r = SetFn{}(r, g[i], i); | ||||||
|  |             return r; | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Vektor, | ||||||
|  |           typename PushFn=push_back_fn> | ||||||
|  | auto benchmark_assoc_mut() | ||||||
|  | { | ||||||
|  |     return [] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  |         if (n > get_limit<Vektor>{}) | ||||||
|  |             nonius::skip(); | ||||||
|  | 
 | ||||||
|  |         auto v = Vektor{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v = PushFn{}(std::move(v), i); | ||||||
|  | 
 | ||||||
|  |         measure(meter, [&] { | ||||||
|  |             auto r = v.transient(); | ||||||
|  |             for (auto i = 0u; i < n; ++i) | ||||||
|  |                 r.set(i, n - i); | ||||||
|  |             return r; | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Vektor, | ||||||
|  |           typename PushFn=push_back_fn> | ||||||
|  | auto benchmark_assoc_mut_random() | ||||||
|  | { | ||||||
|  |     return [] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  |         if (n > get_limit<Vektor>{}) | ||||||
|  |             nonius::skip(); | ||||||
|  | 
 | ||||||
|  |         auto g = make_generator(n); | ||||||
|  |         auto v = Vektor{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v = PushFn{}(std::move(v), i); | ||||||
|  | 
 | ||||||
|  |         measure(meter, [&] { | ||||||
|  |             auto r = v.transient(); | ||||||
|  |             for (auto i = 0u; i < n; ++i) | ||||||
|  |                 r.set(g[i], i); | ||||||
|  |             return r; | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Fn> | ||||||
|  | auto benchmark_assoc_librrb(Fn maker) | ||||||
|  | { | ||||||
|  |     return | ||||||
|  |         [=] (nonius::chronometer meter) { | ||||||
|  |             auto n = meter.param<N>(); | ||||||
|  |             auto v = maker(n); | ||||||
|  |             measure( | ||||||
|  |                 meter, [&] { | ||||||
|  |                     auto r = v; | ||||||
|  |                     for (auto i = 0u; i < n; ++i) | ||||||
|  |                         r = rrb_update(r, i, reinterpret_cast<void*>(n - i)); | ||||||
|  |                     return r; | ||||||
|  |                 }); | ||||||
|  |         }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Fn> | ||||||
|  | auto benchmark_assoc_random_librrb(Fn maker) | ||||||
|  | { | ||||||
|  |     return | ||||||
|  |         [=] (nonius::chronometer meter) { | ||||||
|  |             auto n = meter.param<N>(); | ||||||
|  |             auto v = maker(n); | ||||||
|  |             auto g = make_generator(n); | ||||||
|  |             measure( | ||||||
|  |                 meter, [&] { | ||||||
|  |                     auto r = v; | ||||||
|  |                     for (auto i = 0u; i < n; ++i) | ||||||
|  |                         r = rrb_update(r, g[i], reinterpret_cast<void*>(i)); | ||||||
|  |                     return r; | ||||||
|  |                 }); | ||||||
|  |         }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Fn> | ||||||
|  | auto benchmark_assoc_mut_librrb(Fn maker) | ||||||
|  | { | ||||||
|  |     return | ||||||
|  |         [=] (nonius::chronometer meter) { | ||||||
|  |             auto n = meter.param<N>(); | ||||||
|  |             auto v = maker(n); | ||||||
|  |             measure( | ||||||
|  |                 meter, [&] { | ||||||
|  |                     auto r = rrb_to_transient(v); | ||||||
|  |                     for (auto i = 0u; i < n; ++i) | ||||||
|  |                         r = transient_rrb_update( | ||||||
|  |                             r, i, reinterpret_cast<void*>(i)); | ||||||
|  |                     return r; | ||||||
|  |                 }); | ||||||
|  |         }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Fn> | ||||||
|  | auto benchmark_assoc_mut_random_librrb(Fn maker) | ||||||
|  | { | ||||||
|  |     return | ||||||
|  |         [=] (nonius::chronometer meter) { | ||||||
|  |             auto n = meter.param<N>(); | ||||||
|  |             auto v = maker(n); | ||||||
|  |             auto g = make_generator(n); | ||||||
|  |             measure( | ||||||
|  |                 meter, [&] { | ||||||
|  |                     auto r = rrb_to_transient(v); | ||||||
|  |                     for (auto i = 0u; i < n; ++i) | ||||||
|  |                         r = transient_rrb_update( | ||||||
|  |                             r, g[i], reinterpret_cast<void*>(i)); | ||||||
|  |                     return r; | ||||||
|  |                 }); | ||||||
|  |         }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | } // anonymous namespace
 | ||||||
							
								
								
									
										20
									
								
								third_party/immer/benchmark/vector/branching/access.ipp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								third_party/immer/benchmark/vector/branching/access.ipp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,20 @@ | ||||||
|  | // | ||||||
|  | // 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 "benchmark/vector/access.hpp" | ||||||
|  | #include <immer/flex_vector.hpp> | ||||||
|  | 
 | ||||||
|  | #ifndef MEMORY_T | ||||||
|  | #error "define the MEMORY_T" | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("flex/3", benchmark_access_idx<immer::flex_vector<std::size_t,MEMORY_T,3>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/4", benchmark_access_idx<immer::flex_vector<std::size_t,MEMORY_T,4>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/5", benchmark_access_idx<immer::flex_vector<std::size_t,MEMORY_T,5>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/6", benchmark_access_idx<immer::flex_vector<std::size_t,MEMORY_T,6>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/7", benchmark_access_idx<immer::flex_vector<std::size_t,MEMORY_T,7>>()) | ||||||
							
								
								
									
										20
									
								
								third_party/immer/benchmark/vector/branching/assoc.ipp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								third_party/immer/benchmark/vector/branching/assoc.ipp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,20 @@ | ||||||
|  | // | ||||||
|  | // 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 "benchmark/vector/assoc.hpp" | ||||||
|  | #include <immer/flex_vector.hpp> | ||||||
|  | 
 | ||||||
|  | #ifndef MEMORY_T | ||||||
|  | #error "define the MEMORY_T" | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("flex/3", benchmark_assoc<immer::flex_vector<std::size_t,MEMORY_T,3>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/4", benchmark_assoc<immer::flex_vector<std::size_t,MEMORY_T,4>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/5", benchmark_assoc<immer::flex_vector<std::size_t,MEMORY_T,5>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/6", benchmark_assoc<immer::flex_vector<std::size_t,MEMORY_T,6>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/7", benchmark_assoc<immer::flex_vector<std::size_t,MEMORY_T,7>>()) | ||||||
							
								
								
									
										10
									
								
								third_party/immer/benchmark/vector/branching/basic/access.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								third_party/immer/benchmark/vector/branching/basic/access.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | //
 | ||||||
|  | // 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
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #define MEMORY_T basic_memory | ||||||
|  | #include "../access.ipp" | ||||||
							
								
								
									
										10
									
								
								third_party/immer/benchmark/vector/branching/basic/assoc.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								third_party/immer/benchmark/vector/branching/basic/assoc.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | //
 | ||||||
|  | // 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
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #define MEMORY_T basic_memory | ||||||
|  | #include "../assoc.ipp" | ||||||
							
								
								
									
										10
									
								
								third_party/immer/benchmark/vector/branching/basic/concat.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								third_party/immer/benchmark/vector/branching/basic/concat.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | //
 | ||||||
|  | // 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
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #define MEMORY_T basic_memory | ||||||
|  | #include "../concat.ipp" | ||||||
							
								
								
									
										10
									
								
								third_party/immer/benchmark/vector/branching/basic/push.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								third_party/immer/benchmark/vector/branching/basic/push.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | //
 | ||||||
|  | // 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
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #define MEMORY_T basic_memory | ||||||
|  | #include "../push.ipp" | ||||||
							
								
								
									
										20
									
								
								third_party/immer/benchmark/vector/branching/concat.ipp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								third_party/immer/benchmark/vector/branching/concat.ipp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,20 @@ | ||||||
|  | // | ||||||
|  | // 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 "benchmark/vector/concat.hpp" | ||||||
|  | #include <immer/flex_vector.hpp> | ||||||
|  | 
 | ||||||
|  | #ifndef MEMORY_T | ||||||
|  | #error "define the MEMORY_T" | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("flex/3", benchmark_concat<immer::flex_vector<std::size_t,MEMORY_T,3>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/4", benchmark_concat<immer::flex_vector<std::size_t,MEMORY_T,4>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/5", benchmark_concat<immer::flex_vector<std::size_t,MEMORY_T,5>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/6", benchmark_concat<immer::flex_vector<std::size_t,MEMORY_T,6>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/7", benchmark_concat<immer::flex_vector<std::size_t,MEMORY_T,7>>()) | ||||||
							
								
								
									
										10
									
								
								third_party/immer/benchmark/vector/branching/gc/access.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								third_party/immer/benchmark/vector/branching/gc/access.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | //
 | ||||||
|  | // 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
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #define MEMORY_T gc_memory | ||||||
|  | #include "../access.ipp" | ||||||
							
								
								
									
										10
									
								
								third_party/immer/benchmark/vector/branching/gc/assoc.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								third_party/immer/benchmark/vector/branching/gc/assoc.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | //
 | ||||||
|  | // 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
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #define MEMORY_T gc_memory | ||||||
|  | #include "../assoc.ipp" | ||||||
							
								
								
									
										10
									
								
								third_party/immer/benchmark/vector/branching/gc/concat.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								third_party/immer/benchmark/vector/branching/gc/concat.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | //
 | ||||||
|  | // 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
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #define MEMORY_T gc_memory | ||||||
|  | #include "../concat.ipp" | ||||||
							
								
								
									
										10
									
								
								third_party/immer/benchmark/vector/branching/gc/push.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								third_party/immer/benchmark/vector/branching/gc/push.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | //
 | ||||||
|  | // 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
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #define MEMORY_T gc_memory | ||||||
|  | #include "../push.ipp" | ||||||
							
								
								
									
										20
									
								
								third_party/immer/benchmark/vector/branching/push.ipp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								third_party/immer/benchmark/vector/branching/push.ipp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,20 @@ | ||||||
|  | // | ||||||
|  | // 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 "benchmark/vector/push.hpp" | ||||||
|  | #include <immer/flex_vector.hpp> | ||||||
|  | 
 | ||||||
|  | #ifndef MEMORY_T | ||||||
|  | #error "define the MEMORY_T" | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("flex/3", benchmark_push<immer::flex_vector<std::size_t,MEMORY_T,3>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/4", benchmark_push<immer::flex_vector<std::size_t,MEMORY_T,4>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/5", benchmark_push<immer::flex_vector<std::size_t,MEMORY_T,5>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/6", benchmark_push<immer::flex_vector<std::size_t,MEMORY_T,6>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/7", benchmark_push<immer::flex_vector<std::size_t,MEMORY_T,7>>()) | ||||||
							
								
								
									
										10
									
								
								third_party/immer/benchmark/vector/branching/safe/access.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								third_party/immer/benchmark/vector/branching/safe/access.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | //
 | ||||||
|  | // 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
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #define MEMORY_T safe_memory | ||||||
|  | #include "../access.ipp" | ||||||
							
								
								
									
										10
									
								
								third_party/immer/benchmark/vector/branching/safe/assoc.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								third_party/immer/benchmark/vector/branching/safe/assoc.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | //
 | ||||||
|  | // 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
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #define MEMORY_T safe_memory | ||||||
|  | #include "../assoc.ipp" | ||||||
							
								
								
									
										10
									
								
								third_party/immer/benchmark/vector/branching/safe/concat.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								third_party/immer/benchmark/vector/branching/safe/concat.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | //
 | ||||||
|  | // 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
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #define MEMORY_T safe_memory | ||||||
|  | #include "../concat.ipp" | ||||||
							
								
								
									
										10
									
								
								third_party/immer/benchmark/vector/branching/safe/push.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								third_party/immer/benchmark/vector/branching/safe/push.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | //
 | ||||||
|  | // 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
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #define MEMORY_T safe_memory | ||||||
|  | #include "../push.ipp" | ||||||
							
								
								
									
										10
									
								
								third_party/immer/benchmark/vector/branching/unsafe/access.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								third_party/immer/benchmark/vector/branching/unsafe/access.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | //
 | ||||||
|  | // 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
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #define MEMORY_T unsafe_memory | ||||||
|  | #include "../access.ipp" | ||||||
							
								
								
									
										10
									
								
								third_party/immer/benchmark/vector/branching/unsafe/assoc.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								third_party/immer/benchmark/vector/branching/unsafe/assoc.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | //
 | ||||||
|  | // 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
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #define MEMORY_T unsafe_memory | ||||||
|  | #include "../assoc.ipp" | ||||||
							
								
								
									
										10
									
								
								third_party/immer/benchmark/vector/branching/unsafe/concat.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								third_party/immer/benchmark/vector/branching/unsafe/concat.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | //
 | ||||||
|  | // 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
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #define MEMORY_T unsafe_memory | ||||||
|  | #include "../concat.ipp" | ||||||
							
								
								
									
										10
									
								
								third_party/immer/benchmark/vector/branching/unsafe/push.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								third_party/immer/benchmark/vector/branching/unsafe/push.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | //
 | ||||||
|  | // 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
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #define MEMORY_T unsafe_memory | ||||||
|  | #include "../push.ipp" | ||||||
							
								
								
									
										212
									
								
								third_party/immer/benchmark/vector/common.hpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										212
									
								
								third_party/immer/benchmark/vector/common.hpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,212 @@ | ||||||
|  | //
 | ||||||
|  | // 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
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include <utility> | ||||||
|  | #include <cstddef> | ||||||
|  | #include <limits> | ||||||
|  | 
 | ||||||
|  | #include "benchmark/config.hpp" | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_LIBRRB | ||||||
|  | extern "C" { | ||||||
|  | #define restrict __restrict__ | ||||||
|  | #include <rrb.h> | ||||||
|  | #undef restrict | ||||||
|  | } | ||||||
|  | #include <immer/heap/gc_heap.hpp> | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | namespace immer { | ||||||
|  | template <typename T, typename MP> class array; | ||||||
|  | } // namespace immer
 | ||||||
|  | 
 | ||||||
|  | namespace { | ||||||
|  | 
 | ||||||
|  | auto make_generator(std::size_t runs) | ||||||
|  | { | ||||||
|  |     assert(runs > 0); | ||||||
|  |     auto engine = std::default_random_engine{42}; | ||||||
|  |     auto dist = std::uniform_int_distribution<std::size_t>{0, runs-1}; | ||||||
|  |     auto r = std::vector<std::size_t>(runs); | ||||||
|  |     std::generate_n(r.begin(), runs, std::bind(dist, engine)); | ||||||
|  |     return r; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | struct push_back_fn | ||||||
|  | { | ||||||
|  |     template <typename T, typename U> | ||||||
|  |     auto operator() (T&& v, U&& x) | ||||||
|  |     { return std::forward<T>(v).push_back(std::forward<U>(x)); } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct push_front_fn | ||||||
|  | { | ||||||
|  |     template <typename T, typename U> | ||||||
|  |     auto operator() (T&& v, U&& x) | ||||||
|  |     { return std::forward<T>(v).push_front(std::forward<U>(x)); } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct set_fn | ||||||
|  | { | ||||||
|  |     template <typename T, typename I, typename U> | ||||||
|  |     decltype(auto) operator() (T&& v, I i, U&& x) | ||||||
|  |     { return std::forward<T>(v).set(i, std::forward<U>(x)); } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct store_fn | ||||||
|  | { | ||||||
|  |     template <typename T, typename I, typename U> | ||||||
|  |     decltype(auto) operator() (T&& v, I i, U&& x) | ||||||
|  |     { return std::forward<T>(v).store(i, std::forward<U>(x)); } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | template <typename T> | ||||||
|  | struct get_limit : std::integral_constant< | ||||||
|  |     std::size_t, std::numeric_limits<std::size_t>::max()> {}; | ||||||
|  | 
 | ||||||
|  | template <typename T, typename MP> | ||||||
|  | struct get_limit<immer::array<T, MP>> : std::integral_constant< | ||||||
|  |     std::size_t, 10000> {}; | ||||||
|  | 
 | ||||||
|  | auto make_librrb_vector(std::size_t n) | ||||||
|  | { | ||||||
|  |     auto v = rrb_create(); | ||||||
|  |     for (auto i = 0u; i < n; ++i) { | ||||||
|  |         v = rrb_push(v, reinterpret_cast<void*>(i)); | ||||||
|  |     } | ||||||
|  |     return v; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | auto make_librrb_vector_f(std::size_t n) | ||||||
|  | { | ||||||
|  |     auto v = rrb_create(); | ||||||
|  |     for (auto i = 0u; i < n; ++i) { | ||||||
|  |         auto f = rrb_push(rrb_create(), | ||||||
|  |                           reinterpret_cast<void*>(i)); | ||||||
|  |         v = rrb_concat(f, v); | ||||||
|  |     } | ||||||
|  |     return v; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // copied from:
 | ||||||
|  | // https://github.com/ivmai/bdwgc/blob/master/include/gc_allocator.h
 | ||||||
|  | 
 | ||||||
|  | template <class GC_tp> | ||||||
|  | struct GC_type_traits | ||||||
|  | { | ||||||
|  |   std::false_type GC_is_ptr_free; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | # define GC_DECLARE_PTRFREE(T)                  \ | ||||||
|  |     template<> struct GC_type_traits<T> {       \ | ||||||
|  |         std::true_type GC_is_ptr_free;          \ | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | GC_DECLARE_PTRFREE(char); | ||||||
|  | GC_DECLARE_PTRFREE(signed char); | ||||||
|  | GC_DECLARE_PTRFREE(unsigned char); | ||||||
|  | GC_DECLARE_PTRFREE(signed short); | ||||||
|  | GC_DECLARE_PTRFREE(unsigned short); | ||||||
|  | GC_DECLARE_PTRFREE(signed int); | ||||||
|  | GC_DECLARE_PTRFREE(unsigned int); | ||||||
|  | GC_DECLARE_PTRFREE(signed long); | ||||||
|  | GC_DECLARE_PTRFREE(unsigned long); | ||||||
|  | GC_DECLARE_PTRFREE(float); | ||||||
|  | GC_DECLARE_PTRFREE(double); | ||||||
|  | GC_DECLARE_PTRFREE(long double); | ||||||
|  | 
 | ||||||
|  | template <class IsPtrFree> | ||||||
|  | inline void* GC_selective_alloc(size_t n, IsPtrFree, bool ignore_off_page) | ||||||
|  | { | ||||||
|  |     return ignore_off_page | ||||||
|  |         ? GC_MALLOC_IGNORE_OFF_PAGE(n) | ||||||
|  |         : GC_MALLOC(n); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <> | ||||||
|  | inline void* GC_selective_alloc<std::true_type>(size_t n, | ||||||
|  |                                                 std::true_type, | ||||||
|  |                                                 bool ignore_off_page) | ||||||
|  | { | ||||||
|  |     return ignore_off_page | ||||||
|  |         ? GC_MALLOC_ATOMIC_IGNORE_OFF_PAGE(n) | ||||||
|  |         : GC_MALLOC_ATOMIC(n); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <class T> | ||||||
|  | class gc_allocator | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     typedef size_t       size_type; | ||||||
|  |     typedef ptrdiff_t    difference_type; | ||||||
|  |     typedef T*       pointer; | ||||||
|  |     typedef const T* const_pointer; | ||||||
|  |     typedef T&       reference; | ||||||
|  |     typedef const T& const_reference; | ||||||
|  |     typedef T        value_type; | ||||||
|  | 
 | ||||||
|  |     template <class T1> struct rebind { | ||||||
|  |         typedef gc_allocator<T1> other; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     gc_allocator()  {} | ||||||
|  |     gc_allocator(const gc_allocator&) throw() {} | ||||||
|  |     template <class T1> | ||||||
|  |     explicit gc_allocator(const gc_allocator<T1>&) throw() {} | ||||||
|  |     ~gc_allocator() throw() {} | ||||||
|  | 
 | ||||||
|  |     pointer address(reference GC_x) const { return &GC_x; } | ||||||
|  |     const_pointer address(const_reference GC_x) const { return &GC_x; } | ||||||
|  | 
 | ||||||
|  |     // GC_n is permitted to be 0.  The C++ standard says nothing about what
 | ||||||
|  |     // the return value is when GC_n == 0.
 | ||||||
|  |     T* allocate(size_type GC_n, const void* = 0) | ||||||
|  |     { | ||||||
|  |         GC_type_traits<T> traits; | ||||||
|  |         return static_cast<T *> | ||||||
|  |             (GC_selective_alloc(GC_n * sizeof(T), | ||||||
|  |                                 traits.GC_is_ptr_free, false)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // p is not permitted to be a null pointer.
 | ||||||
|  |     void deallocate(pointer p, size_type /* GC_n */) | ||||||
|  |     { GC_FREE(p); } | ||||||
|  | 
 | ||||||
|  |     size_type max_size() const throw() | ||||||
|  |     { return size_t(-1) / sizeof(T); } | ||||||
|  | 
 | ||||||
|  |     void construct(pointer p, const T& __val) { new(p) T(__val); } | ||||||
|  |     void destroy(pointer p) { p->~T(); } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | template<> | ||||||
|  | class gc_allocator<void> | ||||||
|  | { | ||||||
|  |     typedef size_t      size_type; | ||||||
|  |     typedef ptrdiff_t   difference_type; | ||||||
|  |     typedef void*       pointer; | ||||||
|  |     typedef const void* const_pointer; | ||||||
|  |     typedef void        value_type; | ||||||
|  | 
 | ||||||
|  |     template <class T1> struct rebind { | ||||||
|  |         typedef gc_allocator<T1> other; | ||||||
|  |     }; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | template <class T1, class T2> | ||||||
|  | inline bool operator==(const gc_allocator<T1>&, const gc_allocator<T2>&) | ||||||
|  | { return true; } | ||||||
|  | 
 | ||||||
|  | template <class T1, class T2> | ||||||
|  | inline bool operator!=(const gc_allocator<T1>&, const gc_allocator<T2>&) | ||||||
|  | { return false; } | ||||||
|  | 
 | ||||||
|  | } // anonymous namespace
 | ||||||
							
								
								
									
										166
									
								
								third_party/immer/benchmark/vector/concat.hpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										166
									
								
								third_party/immer/benchmark/vector/concat.hpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,166 @@ | ||||||
|  | //
 | ||||||
|  | // 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
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include "benchmark/vector/common.hpp" | ||||||
|  | 
 | ||||||
|  | namespace { | ||||||
|  | 
 | ||||||
|  | constexpr auto concat_steps = 10u; | ||||||
|  | 
 | ||||||
|  | template <typename Vektor, | ||||||
|  |           typename PushFn=push_back_fn> | ||||||
|  | auto benchmark_concat() | ||||||
|  | { | ||||||
|  |     return [] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  | 
 | ||||||
|  |         auto v = Vektor{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v = PushFn{}(std::move(v), i); | ||||||
|  | 
 | ||||||
|  |         measure(meter, [&] { | ||||||
|  |             return v + v; | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Fn> | ||||||
|  | auto benchmark_concat_librrb(Fn maker) | ||||||
|  | { | ||||||
|  |     return | ||||||
|  |         [=] (nonius::chronometer meter) { | ||||||
|  |             auto n = meter.param<N>(); | ||||||
|  |             auto v = maker(n); | ||||||
|  |             measure(meter, [&] { | ||||||
|  |                     return rrb_concat(v, v); | ||||||
|  |                 }); | ||||||
|  |         }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Vektor, | ||||||
|  |           typename PushFn=push_back_fn> | ||||||
|  | auto benchmark_concat_incr() | ||||||
|  | { | ||||||
|  |     return | ||||||
|  |         [] (nonius::chronometer meter) | ||||||
|  |         { | ||||||
|  |             auto n = meter.param<N>(); | ||||||
|  | 
 | ||||||
|  |             auto v = Vektor{}; | ||||||
|  |             for (auto i = 0u; i < n / concat_steps; ++i) | ||||||
|  |                 v = PushFn{}(std::move(v), i); | ||||||
|  | 
 | ||||||
|  |             measure(meter, [&] { | ||||||
|  |                     auto r = Vektor{}; | ||||||
|  |                     for (auto i = 0u; i < concat_steps; ++i) | ||||||
|  |                         r = r + v; | ||||||
|  |                     return r; | ||||||
|  |                 }); | ||||||
|  |         }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Vektor> | ||||||
|  | auto benchmark_concat_incr_mut() | ||||||
|  | { | ||||||
|  |     return | ||||||
|  |         [] (nonius::chronometer meter) | ||||||
|  |         { | ||||||
|  |             auto n = meter.param<N>(); | ||||||
|  | 
 | ||||||
|  |             auto v = Vektor{}.transient(); | ||||||
|  |             for (auto i = 0u; i < n / concat_steps; ++i) | ||||||
|  |                 v.push_back(i); | ||||||
|  | 
 | ||||||
|  |             measure(meter, [&] (int run) { | ||||||
|  |                 auto r = Vektor{}.transient(); | ||||||
|  |                 for (auto i = 0u; i < concat_steps; ++i) | ||||||
|  |                     r.append(v); | ||||||
|  |                 return r; | ||||||
|  |             }); | ||||||
|  |         }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Vektor> | ||||||
|  | auto benchmark_concat_incr_mut2() | ||||||
|  | { | ||||||
|  |     return | ||||||
|  |         [] (nonius::chronometer meter) | ||||||
|  |         { | ||||||
|  |             auto n = meter.param<N>(); | ||||||
|  | 
 | ||||||
|  |             using transient_t = typename Vektor::transient_type; | ||||||
|  |             using steps_t = std::vector<transient_t, gc_allocator<transient_t>>; | ||||||
|  |             auto vs = std::vector<steps_t, gc_allocator<steps_t>>(meter.runs()); | ||||||
|  |             for (auto k = 0u; k < vs.size(); ++k) { | ||||||
|  |                 vs[k].reserve(concat_steps); | ||||||
|  |                 for (auto j = 0u; j < concat_steps; ++j) { | ||||||
|  |                     auto vv = Vektor{}.transient(); | ||||||
|  |                     for (auto i = 0u; i < n / concat_steps; ++i) | ||||||
|  |                         vv.push_back(i); | ||||||
|  |                     vs[k].push_back(std::move(vv)); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             measure(meter, [&] (int run) { | ||||||
|  |                 auto& vr = vs[run]; | ||||||
|  |                 auto r = Vektor{}.transient(); | ||||||
|  |                 assert(vr.size() == concat_steps); | ||||||
|  |                 for (auto i = 0u; i < concat_steps; ++i) | ||||||
|  |                     r.append(std::move(vr[i])); | ||||||
|  |                 return r; | ||||||
|  |             }); | ||||||
|  |         }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Vektor> | ||||||
|  | auto benchmark_concat_incr_chunkedseq() | ||||||
|  | { | ||||||
|  |     return | ||||||
|  |         [] (nonius::chronometer meter) | ||||||
|  |         { | ||||||
|  |             auto n = meter.param<N>(); | ||||||
|  | 
 | ||||||
|  |             using steps_t = std::vector<Vektor>; | ||||||
|  |             auto vs = std::vector<steps_t>(meter.runs()); | ||||||
|  |             for (auto k = 0u; k < vs.size(); ++k) { | ||||||
|  |                 for (auto j = 0u; j < concat_steps; ++j) { | ||||||
|  |                     auto vv = Vektor{}; | ||||||
|  |                     for (auto i = 0u; i < n / concat_steps; ++i) | ||||||
|  |                         vv.push_back(i); | ||||||
|  |                     vs[k].push_back(std::move(vv)); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             measure(meter, [&] (int run) { | ||||||
|  |                 auto& vr = vs[run]; | ||||||
|  |                 auto r = Vektor{}; | ||||||
|  |                 for (auto i = 0u; i < concat_steps; ++i) | ||||||
|  |                     r.concat(vr[i]); | ||||||
|  |                 return r; | ||||||
|  |             }); | ||||||
|  |         }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Fn> | ||||||
|  | auto benchmark_concat_incr_librrb(Fn maker) | ||||||
|  | { | ||||||
|  |     return | ||||||
|  |         [=] (nonius::chronometer meter) { | ||||||
|  |             auto n = meter.param<N>(); | ||||||
|  |             auto v = maker(n / concat_steps); | ||||||
|  |             measure(meter, [&] { | ||||||
|  |                     auto r = rrb_create(); | ||||||
|  |                     for (auto i = 0ul; i < concat_steps; ++i) | ||||||
|  |                         r = rrb_concat(r, v); | ||||||
|  |                     return r; | ||||||
|  |                 }); | ||||||
|  |         }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | } // anonymous namespace
 | ||||||
							
								
								
									
										142
									
								
								third_party/immer/benchmark/vector/drop.hpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								third_party/immer/benchmark/vector/drop.hpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,142 @@ | ||||||
|  | //
 | ||||||
|  | // 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
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include "benchmark/vector/common.hpp" | ||||||
|  | 
 | ||||||
|  | namespace { | ||||||
|  | 
 | ||||||
|  | template <typename Vektor, | ||||||
|  |           typename PushFn=push_back_fn> | ||||||
|  | auto benchmark_drop() | ||||||
|  | { | ||||||
|  |     return [] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  | 
 | ||||||
|  |         auto v = Vektor{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v = PushFn{}(std::move(v), i); | ||||||
|  | 
 | ||||||
|  |         measure(meter, [&] { | ||||||
|  |             for (auto i = 0u; i < n; ++i) | ||||||
|  |                 (void) v.drop(i); | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Vektor, | ||||||
|  |           typename PushFn=push_back_fn> | ||||||
|  | auto benchmark_drop_lin() | ||||||
|  | { | ||||||
|  |     return [] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  | 
 | ||||||
|  |         auto v = Vektor{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v = PushFn{}(std::move(v), i); | ||||||
|  | 
 | ||||||
|  |         measure(meter, [&] { | ||||||
|  |             auto r = v; | ||||||
|  |             for (auto i = 0u; i < n; ++i) | ||||||
|  |                 r = r.drop(1); | ||||||
|  |             return r; | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Vektor, | ||||||
|  |           typename PushFn=push_back_fn> | ||||||
|  | auto benchmark_drop_move() | ||||||
|  | { | ||||||
|  |     return [] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  | 
 | ||||||
|  |         auto v = Vektor{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v = PushFn{}(std::move(v), i); | ||||||
|  | 
 | ||||||
|  |         measure(meter, [&] { | ||||||
|  |             auto r = v; | ||||||
|  |             for (auto i = 0u; i < n; ++i) | ||||||
|  |                 r = std::move(r).drop(1); | ||||||
|  |             return r; | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Vektor, | ||||||
|  |           typename PushFn=push_back_fn> | ||||||
|  | auto benchmark_drop_mut() | ||||||
|  | { | ||||||
|  |     return [] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  | 
 | ||||||
|  |         auto vv = Vektor{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             vv = PushFn{}(std::move(vv), i); | ||||||
|  | 
 | ||||||
|  |         measure(meter, [&] { | ||||||
|  |             auto v = vv.transient(); | ||||||
|  |             for (auto i = 0u; i < n; ++i) | ||||||
|  |                 (void) v.drop(1); | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Fn> | ||||||
|  | auto benchmark_drop_librrb(Fn make) | ||||||
|  | { | ||||||
|  |     return [=] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  |         auto v = make(n); | ||||||
|  |         measure(meter, [&] { | ||||||
|  |                 for (auto i = 0u; i < n; ++i) | ||||||
|  |                     rrb_slice(v, i, n); | ||||||
|  |             }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Fn> | ||||||
|  | auto benchmark_drop_lin_librrb(Fn make) | ||||||
|  | { | ||||||
|  |     return [=] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  |         auto v = make(n); | ||||||
|  |         measure(meter, [&] { | ||||||
|  |                 auto r = v; | ||||||
|  |                 for (auto i = 0u; i < n; ++i) | ||||||
|  |                     r = rrb_slice(r, 1, n); | ||||||
|  |                 return r; | ||||||
|  |             }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Fn> | ||||||
|  | auto benchmark_drop_mut_librrb(Fn make) | ||||||
|  | { | ||||||
|  |     return [=] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  |         auto v = make(n); | ||||||
|  |         measure(meter, [&] { | ||||||
|  |                 auto r = rrb_to_transient(v); | ||||||
|  |                 for (auto i = 0u; i < n; ++i) | ||||||
|  |                     r = transient_rrb_slice(r, 1, n); | ||||||
|  |                 return r; | ||||||
|  |             }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | } // anonymous namespace
 | ||||||
							
								
								
									
										94
									
								
								third_party/immer/benchmark/vector/misc/access.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								third_party/immer/benchmark/vector/misc/access.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,94 @@ | ||||||
|  | //
 | ||||||
|  | // 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 "benchmark/vector/access.hpp" | ||||||
|  | 
 | ||||||
|  | #include <immer/algorithm.hpp> | ||||||
|  | #include <immer/array.hpp> | ||||||
|  | #include <immer/flex_vector.hpp> | ||||||
|  | #include <immer/vector.hpp> | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_EXPERIMENTAL | ||||||
|  | #include <immer/experimental/dvektor.hpp> | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_STEADY | ||||||
|  | #define QUARK_ASSERT_ON 0 | ||||||
|  | #include <steady/steady_vector.h> | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #include <vector> | ||||||
|  | #include <list> | ||||||
|  | #include <numeric> | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("std::vector", benchmark_access_iter_std<std::vector<unsigned>>()) | ||||||
|  | NONIUS_BENCHMARK("std::vector/idx", benchmark_access_idx_std<std::vector<unsigned>>()) | ||||||
|  | NONIUS_BENCHMARK("std::vector/random", benchmark_access_random_std<std::vector<unsigned>>()) | ||||||
|  | NONIUS_BENCHMARK("std::list", benchmark_access_iter_std<std::list<unsigned>>()) | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_LIBRRB | ||||||
|  | NONIUS_BENCHMARK("librrb", benchmark_access_librrb(make_librrb_vector)) | ||||||
|  | NONIUS_BENCHMARK("librrb/F", benchmark_access_librrb(make_librrb_vector_f)) | ||||||
|  | NONIUS_BENCHMARK("librrb/random", benchmark_access_random_librrb(make_librrb_vector)) | ||||||
|  | NONIUS_BENCHMARK("librrb/F/random", benchmark_access_random_librrb(make_librrb_vector_f)) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("flex/5B",     benchmark_access_iter<immer::flex_vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/F/5B",   benchmark_access_iter<immer::flex_vector<unsigned,def_memory,5>,push_front_fn>()) | ||||||
|  | NONIUS_BENCHMARK("vector/4B",   benchmark_access_iter<immer::vector<unsigned,def_memory,4>>()) | ||||||
|  | NONIUS_BENCHMARK("vector/5B",   benchmark_access_iter<immer::vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("vector/6B",   benchmark_access_iter<immer::vector<unsigned,def_memory,6>>()) | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_EXPERIMENTAL | ||||||
|  | NONIUS_BENCHMARK("dvektor/4B",  benchmark_access_iter<immer::dvektor<unsigned,def_memory,4>>()) | ||||||
|  | NONIUS_BENCHMARK("dvektor/5B",  benchmark_access_iter<immer::dvektor<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("dvektor/6B",  benchmark_access_iter<immer::dvektor<unsigned,def_memory,6>>()) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_STEADY | ||||||
|  | NONIUS_BENCHMARK("steady/idx",      benchmark_access_idx<steady::vector<unsigned>>()) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("flex/5B/idx",     benchmark_access_idx<immer::flex_vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/F/5B/idx",   benchmark_access_idx<immer::flex_vector<unsigned,def_memory,5>,push_front_fn>()) | ||||||
|  | NONIUS_BENCHMARK("vector/4B/idx",   benchmark_access_idx<immer::vector<unsigned,def_memory,4>>()) | ||||||
|  | NONIUS_BENCHMARK("vector/5B/idx",   benchmark_access_idx<immer::vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("vector/6B/idx",   benchmark_access_idx<immer::vector<unsigned,def_memory,6>>()) | ||||||
|  | #if IMMER_BENCHMARK_EXPERIMENTAL | ||||||
|  | NONIUS_BENCHMARK("dvektor/4B/idx",  benchmark_access_idx<immer::dvektor<unsigned,def_memory,4>>()) | ||||||
|  | NONIUS_BENCHMARK("dvektor/5B/idx",  benchmark_access_idx<immer::dvektor<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("dvektor/6B/idx",  benchmark_access_idx<immer::dvektor<unsigned,def_memory,6>>()) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("flex/5B/reduce_i", benchmark_access_reduce_range<immer::flex_vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("vector/5B/reduce_i", benchmark_access_reduce_range<immer::vector<unsigned,def_memory,5>>()) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("flex/5B/reduce",   benchmark_access_reduce<immer::flex_vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/F/5B/reduce", benchmark_access_reduce<immer::flex_vector<unsigned,def_memory,5>,push_front_fn>()) | ||||||
|  | NONIUS_BENCHMARK("vector/4B/reduce", benchmark_access_reduce<immer::vector<unsigned,def_memory,4>>()) | ||||||
|  | NONIUS_BENCHMARK("vector/5B/reduce", benchmark_access_reduce<immer::vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("vector/6B/reduce", benchmark_access_reduce<immer::vector<unsigned,def_memory,6>>()) | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_STEADY | ||||||
|  | NONIUS_BENCHMARK("steady/random",      benchmark_access_random<steady::vector<unsigned>>()) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("flex/5B/random",     benchmark_access_random<immer::flex_vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/F/5B/random",   benchmark_access_random<immer::flex_vector<unsigned,def_memory,5>, push_front_fn>()) | ||||||
|  | NONIUS_BENCHMARK("vector/4B/random",   benchmark_access_random<immer::vector<unsigned,def_memory,4>>()) | ||||||
|  | NONIUS_BENCHMARK("vector/5B/random",   benchmark_access_random<immer::vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("vector/6B/random",   benchmark_access_random<immer::vector<unsigned,def_memory,6>>()) | ||||||
|  | #if IMMER_BENCHMARK_EXPERIMENTAL | ||||||
|  | NONIUS_BENCHMARK("dvektor/4B/random",  benchmark_access_random<immer::dvektor<unsigned,def_memory,4>>()) | ||||||
|  | NONIUS_BENCHMARK("dvektor/5B/random",  benchmark_access_random<immer::dvektor<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("dvektor/6B/random",  benchmark_access_random<immer::dvektor<unsigned,def_memory,6>>()) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_BOOST_COROUTINE | ||||||
|  | NONIUS_BENCHMARK("vector/5B/coro", benchmark_access_coro<immer::vector<unsigned,def_memory,5>>()) | ||||||
|  | #endif | ||||||
							
								
								
									
										119
									
								
								third_party/immer/benchmark/vector/misc/assoc.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								third_party/immer/benchmark/vector/misc/assoc.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,119 @@ | ||||||
|  | //
 | ||||||
|  | // 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 "benchmark/vector/assoc.hpp" | ||||||
|  | 
 | ||||||
|  | #include <immer/array.hpp> | ||||||
|  | #include <immer/flex_vector.hpp> | ||||||
|  | #include <immer/flex_vector_transient.hpp> | ||||||
|  | #include <immer/vector.hpp> | ||||||
|  | #include <immer/vector_transient.hpp> | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_EXPERIMENTAL | ||||||
|  | #include <immer/experimental/dvektor.hpp> | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #include <immer/heap/gc_heap.hpp> | ||||||
|  | #include <immer/refcount/no_refcount_policy.hpp> | ||||||
|  | #include <immer/refcount/unsafe_refcount_policy.hpp> | ||||||
|  | 
 | ||||||
|  | #include <vector> | ||||||
|  | #include <list> | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_STEADY | ||||||
|  | #define QUARK_ASSERT_ON 0 | ||||||
|  | #include <steady/steady_vector.h> | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_LIBRRB | ||||||
|  | extern "C" { | ||||||
|  | #define restrict __restrict__ | ||||||
|  | #include <rrb.h> | ||||||
|  | #undef restrict | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("std::vector", benchmark_assoc_std<std::vector<unsigned>>()) | ||||||
|  | NONIUS_BENCHMARK("std::vector/random", benchmark_assoc_random_std<std::vector<unsigned>>()) | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_LIBRRB | ||||||
|  | NONIUS_BENCHMARK("librrb", benchmark_assoc_librrb(make_librrb_vector)) | ||||||
|  | NONIUS_BENCHMARK("librrb/F", benchmark_assoc_librrb(make_librrb_vector_f)) | ||||||
|  | NONIUS_BENCHMARK("librrb/random", benchmark_assoc_random_librrb(make_librrb_vector)) | ||||||
|  | NONIUS_BENCHMARK("t/librrb", benchmark_assoc_mut_librrb(make_librrb_vector)) | ||||||
|  | NONIUS_BENCHMARK("t/librrb/F", benchmark_assoc_mut_librrb(make_librrb_vector_f)) | ||||||
|  | NONIUS_BENCHMARK("t/librrb/random", benchmark_assoc_mut_random_librrb(make_librrb_vector)) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_STEADY | ||||||
|  | NONIUS_BENCHMARK("steady",     benchmark_assoc<steady::vector<unsigned>, push_back_fn, store_fn>()) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("flex/5B",    benchmark_assoc<immer::flex_vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/F/5B",  benchmark_assoc<immer::flex_vector<unsigned,def_memory,5>,push_front_fn>()) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("flex/GC",    benchmark_assoc<immer::flex_vector<unsigned,gc_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/F/GC",  benchmark_assoc<immer::flex_vector<unsigned,gc_memory,5>,push_front_fn>()) | ||||||
|  | NONIUS_BENCHMARK("flex/F/GCF", benchmark_assoc<immer::flex_vector<unsigned,gcf_memory,5>,push_front_fn>()) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("flex_s/GC",  benchmark_assoc<immer::flex_vector<std::size_t,gc_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("flex_s/F/GC",benchmark_assoc<immer::flex_vector<std::size_t,gc_memory,5>,push_front_fn>()) | ||||||
|  | NONIUS_BENCHMARK("flex_s/F/GCF",benchmark_assoc<immer::flex_vector<std::size_t,gcf_memory,5>,push_front_fn>()) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("vector/4B",  benchmark_assoc<immer::vector<unsigned,def_memory,4>>()) | ||||||
|  | NONIUS_BENCHMARK("vector/5B",  benchmark_assoc<immer::vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("vector/6B",  benchmark_assoc<immer::vector<unsigned,def_memory,6>>()) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("vector/GC",  benchmark_assoc<immer::vector<unsigned,gc_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("vector/NO",  benchmark_assoc<immer::vector<unsigned,basic_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("vector/UN",  benchmark_assoc<immer::vector<unsigned,unsafe_memory,5>>()) | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_EXPERIMENTAL | ||||||
|  | NONIUS_BENCHMARK("dvektor/4B", benchmark_assoc<immer::dvektor<unsigned,def_memory,4>>()) | ||||||
|  | NONIUS_BENCHMARK("dvektor/5B", benchmark_assoc<immer::dvektor<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("dvektor/6B", benchmark_assoc<immer::dvektor<unsigned,def_memory,6>>()) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("dvektor/GC", benchmark_assoc<immer::dvektor<unsigned,gc_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("dvektor/NO", benchmark_assoc<immer::dvektor<unsigned,basic_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("dvektor/UN", benchmark_assoc<immer::dvektor<unsigned,unsafe_memory,5>>()) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("array",      benchmark_assoc<immer::array<unsigned>>()) | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_STEADY | ||||||
|  | NONIUS_BENCHMARK("steady/random",      benchmark_assoc_random<steady::vector<unsigned>, push_back_fn, store_fn>()) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("flex/5B/random",     benchmark_assoc_random<immer::flex_vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("vector/4B/random",   benchmark_assoc_random<immer::vector<unsigned,def_memory,4>>()) | ||||||
|  | NONIUS_BENCHMARK("vector/5B/random",   benchmark_assoc_random<immer::vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("vector/6B/random",   benchmark_assoc_random<immer::vector<unsigned,def_memory,6>>()) | ||||||
|  | #if IMMER_BENCHMARK_EXPERIMENTAL | ||||||
|  | NONIUS_BENCHMARK("dvektor/4B/random",  benchmark_assoc_random<immer::dvektor<unsigned,def_memory,4>>()) | ||||||
|  | NONIUS_BENCHMARK("dvektor/5B/random",  benchmark_assoc_random<immer::dvektor<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("dvektor/6B/random",  benchmark_assoc_random<immer::dvektor<unsigned,def_memory,6>>()) | ||||||
|  | #endif | ||||||
|  | NONIUS_BENCHMARK("array/random",       benchmark_assoc_random<immer::array<unsigned>>()) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("t/vector/5B",  benchmark_assoc_mut<immer::vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("t/vector/GC",  benchmark_assoc_mut<immer::vector<unsigned,gc_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("t/vector/NO",  benchmark_assoc_mut<immer::vector<unsigned,basic_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("t/vector/UN",  benchmark_assoc_mut<immer::vector<unsigned,unsafe_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("t/flex/F/5B",  benchmark_assoc_mut<immer::flex_vector<unsigned,def_memory,5>,push_front_fn>()) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("m/vector/5B",  benchmark_assoc_move<immer::vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("m/vector/GC",  benchmark_assoc_move<immer::vector<unsigned,gc_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("m/vector/NO",  benchmark_assoc_move<immer::vector<unsigned,basic_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("m/vector/UN",  benchmark_assoc_move<immer::vector<unsigned,unsafe_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("m/flex/F/5B",  benchmark_assoc_move<immer::flex_vector<unsigned,def_memory,5>,push_front_fn>()) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("t/vector/5B/random",  benchmark_assoc_mut_random<immer::vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("t/vector/GC/random",  benchmark_assoc_mut_random<immer::vector<unsigned,gc_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("t/vector/NO/random",  benchmark_assoc_mut_random<immer::vector<unsigned,basic_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("t/vector/UN/random",  benchmark_assoc_mut_random<immer::vector<unsigned,unsafe_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("t/flex/F/5B/random",  benchmark_assoc_mut_random<immer::flex_vector<unsigned,def_memory,5>,push_front_fn>()) | ||||||
							
								
								
									
										49
									
								
								third_party/immer/benchmark/vector/misc/concat.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								third_party/immer/benchmark/vector/misc/concat.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,49 @@ | ||||||
|  | //
 | ||||||
|  | // 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 "benchmark/vector/concat.hpp" | ||||||
|  | 
 | ||||||
|  | #include <immer/flex_vector.hpp> | ||||||
|  | #include <immer/flex_vector_transient.hpp> | ||||||
|  | #include <immer/heap/gc_heap.hpp> | ||||||
|  | #include <immer/refcount/no_refcount_policy.hpp> | ||||||
|  | #include <immer/refcount/unsafe_refcount_policy.hpp> | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_LIBRRB | ||||||
|  | extern "C" { | ||||||
|  | #define restrict __restrict__ | ||||||
|  | #include <rrb.h> | ||||||
|  | #undef restrict | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_LIBRRB | ||||||
|  | NONIUS_BENCHMARK("librrb", benchmark_concat_librrb(make_librrb_vector)) | ||||||
|  | NONIUS_BENCHMARK("librrb/F", benchmark_concat_librrb(make_librrb_vector_f)) | ||||||
|  | NONIUS_BENCHMARK("i/librrb", benchmark_concat_incr_librrb(make_librrb_vector)) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("flex/4B", benchmark_concat<immer::flex_vector<unsigned,def_memory,4>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/5B", benchmark_concat<immer::flex_vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/6B", benchmark_concat<immer::flex_vector<unsigned,def_memory,6>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/GC", benchmark_concat<immer::flex_vector<unsigned,gc_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("flex_s/GC", benchmark_concat<immer::flex_vector<std::size_t,gc_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/NO", benchmark_concat<immer::flex_vector<unsigned,basic_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/UN", benchmark_concat<immer::flex_vector<unsigned,unsafe_memory,5>>()) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("flex/F/5B", benchmark_concat<immer::flex_vector<unsigned,def_memory,5>,push_front_fn>()) | ||||||
|  | NONIUS_BENCHMARK("flex/F/GC", benchmark_concat<immer::flex_vector<unsigned,gc_memory,5>,push_front_fn>()) | ||||||
|  | NONIUS_BENCHMARK("flex_s/F/GC", benchmark_concat<immer::flex_vector<std::size_t,gc_memory,5>,push_front_fn>()) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("i/flex/GC", benchmark_concat_incr<immer::flex_vector<unsigned,gc_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("i/flex_s/GC", benchmark_concat_incr<immer::flex_vector<std::size_t,gc_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("i/flex/5B", benchmark_concat_incr<immer::flex_vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("i/flex/UN", benchmark_concat_incr<immer::flex_vector<unsigned,unsafe_memory,5>>()) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("m/flex/GC", benchmark_concat_incr_mut<immer::flex_vector<unsigned,gc_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("m/flex_s/GC", benchmark_concat_incr_mut<immer::flex_vector<std::size_t,gc_memory,5>>()) | ||||||
							
								
								
									
										63
									
								
								third_party/immer/benchmark/vector/misc/drop.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								third_party/immer/benchmark/vector/misc/drop.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,63 @@ | ||||||
|  | //
 | ||||||
|  | // 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 "benchmark/vector/drop.hpp" | ||||||
|  | 
 | ||||||
|  | #include <immer/flex_vector.hpp> | ||||||
|  | #include <immer/flex_vector_transient.hpp> | ||||||
|  | #include <immer/heap/gc_heap.hpp> | ||||||
|  | #include <immer/refcount/no_refcount_policy.hpp> | ||||||
|  | #include <immer/refcount/unsafe_refcount_policy.hpp> | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_LIBRRB | ||||||
|  | extern "C" { | ||||||
|  | #define restrict __restrict__ | ||||||
|  | #include <rrb.h> | ||||||
|  | #undef restrict | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_LIBRRB | ||||||
|  | NONIUS_BENCHMARK("librrb", benchmark_drop_librrb(make_librrb_vector)) | ||||||
|  | NONIUS_BENCHMARK("librrb/F", benchmark_drop_librrb(make_librrb_vector_f)) | ||||||
|  | NONIUS_BENCHMARK("l/librrb", benchmark_drop_lin_librrb(make_librrb_vector)) | ||||||
|  | NONIUS_BENCHMARK("l/librrb/F", benchmark_drop_lin_librrb(make_librrb_vector_f)) | ||||||
|  | NONIUS_BENCHMARK("t/librrb", benchmark_drop_mut_librrb(make_librrb_vector)) | ||||||
|  | NONIUS_BENCHMARK("t/librrb/F", benchmark_drop_mut_librrb(make_librrb_vector_f)) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("flex/4B", benchmark_drop<immer::flex_vector<unsigned,def_memory,4>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/5B", benchmark_drop<immer::flex_vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/6B", benchmark_drop<immer::flex_vector<unsigned,def_memory,6>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/GC", benchmark_drop<immer::flex_vector<unsigned,gc_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/NO", benchmark_drop<immer::flex_vector<unsigned,basic_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/UN", benchmark_drop<immer::flex_vector<unsigned,unsafe_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("flex_s/GC", benchmark_drop<immer::flex_vector<std::size_t,gc_memory,5>>()) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("flex/F/5B", benchmark_drop<immer::flex_vector<unsigned,def_memory,5>, push_front_fn>()) | ||||||
|  | NONIUS_BENCHMARK("flex/F/GC", benchmark_drop<immer::flex_vector<unsigned,gc_memory,5>, push_front_fn>()) | ||||||
|  | NONIUS_BENCHMARK("flex/F/GCF", benchmark_drop<immer::flex_vector<unsigned,gcf_memory,5>, push_front_fn>()) | ||||||
|  | NONIUS_BENCHMARK("flex_s/F/GC", benchmark_drop<immer::flex_vector<std::size_t,gc_memory,5>, push_front_fn>()) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("l/flex/5B", benchmark_drop_lin<immer::flex_vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("l/flex/GC", benchmark_drop_lin<immer::flex_vector<unsigned,gc_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("l/flex/NO", benchmark_drop_lin<immer::flex_vector<unsigned,basic_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("l/flex/UN", benchmark_drop_lin<immer::flex_vector<unsigned,unsafe_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("l/flex/F/5B", benchmark_drop_lin<immer::flex_vector<unsigned,def_memory,5>, push_front_fn>()) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("m/flex/5B", benchmark_drop_move<immer::flex_vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("m/flex/GC", benchmark_drop_move<immer::flex_vector<unsigned,gc_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("m/flex/NO", benchmark_drop_move<immer::flex_vector<unsigned,basic_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("m/flex/UN", benchmark_drop_move<immer::flex_vector<unsigned,unsafe_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("m/flex/F/5B", benchmark_drop_move<immer::flex_vector<unsigned,def_memory,5>, push_front_fn>()) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("t/flex/5B", benchmark_drop_mut<immer::flex_vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("t/flex/GC", benchmark_drop_mut<immer::flex_vector<unsigned,gc_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("t/flex/NO", benchmark_drop_mut<immer::flex_vector<unsigned,basic_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("t/flex/UN", benchmark_drop_mut<immer::flex_vector<unsigned,unsafe_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("t/flex/F/5B", benchmark_drop_mut<immer::flex_vector<unsigned,def_memory,5>, push_front_fn>()) | ||||||
							
								
								
									
										30
									
								
								third_party/immer/benchmark/vector/misc/push-front.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								third_party/immer/benchmark/vector/misc/push-front.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,30 @@ | ||||||
|  | //
 | ||||||
|  | // 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 "benchmark/vector/push_front.hpp" | ||||||
|  | 
 | ||||||
|  | #include <immer/flex_vector.hpp> | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_LIBRRB | ||||||
|  | extern "C" { | ||||||
|  | #define restrict __restrict__ | ||||||
|  | #include <rrb.h> | ||||||
|  | #undef restrict | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_LIBRRB | ||||||
|  | NONIUS_BENCHMARK("librrb", benchmark_push_front_librrb) | ||||||
|  | #endif | ||||||
|  | NONIUS_BENCHMARK("flex/4B", bechmark_push_front<immer::flex_vector<unsigned,def_memory,4>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/5B", bechmark_push_front<immer::flex_vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/6B", bechmark_push_front<immer::flex_vector<unsigned,def_memory,6>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/GC", bechmark_push_front<immer::flex_vector<unsigned,gc_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("flex_s/GC", bechmark_push_front<immer::flex_vector<std::size_t,gc_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/NO", bechmark_push_front<immer::flex_vector<unsigned,basic_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("flex/UN", bechmark_push_front<immer::flex_vector<unsigned,unsafe_memory,5>>()) | ||||||
							
								
								
									
										83
									
								
								third_party/immer/benchmark/vector/misc/push.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								third_party/immer/benchmark/vector/misc/push.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,83 @@ | ||||||
|  | //
 | ||||||
|  | // 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 "benchmark/vector/push.hpp" | ||||||
|  | 
 | ||||||
|  | #include <immer/array.hpp> | ||||||
|  | #include <immer/flex_vector.hpp> | ||||||
|  | #include <immer/vector_transient.hpp> | ||||||
|  | #include <immer/vector.hpp> | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_EXPERIMENTAL | ||||||
|  | #include <immer/experimental/dvektor.hpp> | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #include <immer/heap/gc_heap.hpp> | ||||||
|  | #include <immer/refcount/no_refcount_policy.hpp> | ||||||
|  | #include <immer/refcount/unsafe_refcount_policy.hpp> | ||||||
|  | 
 | ||||||
|  | #include <vector> | ||||||
|  | #include <list> | ||||||
|  | #include <numeric> | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_STEADY | ||||||
|  | #define QUARK_ASSERT_ON 0 | ||||||
|  | #include <steady/steady_vector.h> | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_LIBRRB | ||||||
|  | extern "C" { | ||||||
|  | #define restrict __restrict__ | ||||||
|  | #include <rrb.h> | ||||||
|  | #undef restrict | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_LIBRRB | ||||||
|  | NONIUS_BENCHMARK("librrb", benchmark_push_librrb) | ||||||
|  | NONIUS_BENCHMARK("t/librrb", benchmark_push_mut_librrb) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("std::vector", benchmark_push_mut_std<std::vector<unsigned>>()) | ||||||
|  | NONIUS_BENCHMARK("std::list",   benchmark_push_mut_std<std::list<unsigned>>()) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("m/vector/5B", benchmark_push_move<immer::vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("m/vector/GC", benchmark_push_move<immer::vector<unsigned,gc_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("m/vector/NO", benchmark_push_move<immer::vector<unsigned,basic_memory,5>>()) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("t/vector/5B", benchmark_push_mut<immer::vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("t/vector/GC", benchmark_push_mut<immer::vector<unsigned,gc_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("t/vector/NO", benchmark_push_mut<immer::vector<unsigned,basic_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("t/vector/UN", benchmark_push_mut<immer::vector<unsigned,unsafe_memory,5>>()) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("flex/5B",    benchmark_push<immer::flex_vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("flex_s/GC",  benchmark_push<immer::flex_vector<std::size_t,gc_memory,5>>()) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("vector/4B",  benchmark_push<immer::vector<unsigned,def_memory,4>>()) | ||||||
|  | NONIUS_BENCHMARK("vector/5B",  benchmark_push<immer::vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("vector/6B",  benchmark_push<immer::vector<unsigned,def_memory,6>>()) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("vector/GC",  benchmark_push<immer::vector<unsigned,gc_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("vector/NO",  benchmark_push<immer::vector<unsigned,basic_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("vector/UN",  benchmark_push<immer::vector<unsigned,unsafe_memory,5>>()) | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_EXPERIMENTAL | ||||||
|  | NONIUS_BENCHMARK("dvektor/4B", benchmark_push<immer::dvektor<unsigned,def_memory,4>>()) | ||||||
|  | NONIUS_BENCHMARK("dvektor/5B", benchmark_push<immer::dvektor<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("dvektor/6B", benchmark_push<immer::dvektor<unsigned,def_memory,6>>()) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("dvektor/GC", benchmark_push<immer::dvektor<unsigned,gc_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("dvektor/NO", benchmark_push<immer::dvektor<unsigned,basic_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("dvektor/UN", benchmark_push<immer::dvektor<unsigned,unsafe_memory,5>>()) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("array",      benchmark_push<immer::array<unsigned>>()) | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_STEADY | ||||||
|  | NONIUS_BENCHMARK("steady",     benchmark_push<steady::vector<unsigned>>()) | ||||||
|  | #endif | ||||||
							
								
								
									
										65
									
								
								third_party/immer/benchmark/vector/misc/take.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								third_party/immer/benchmark/vector/misc/take.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,65 @@ | ||||||
|  | //
 | ||||||
|  | // 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 "benchmark/vector/take.hpp" | ||||||
|  | 
 | ||||||
|  | #include <immer/vector.hpp> | ||||||
|  | #include <immer/flex_vector.hpp> | ||||||
|  | #include <immer/vector_transient.hpp> | ||||||
|  | #include <immer/flex_vector_transient.hpp> | ||||||
|  | #include <immer/heap/gc_heap.hpp> | ||||||
|  | #include <immer/refcount/no_refcount_policy.hpp> | ||||||
|  | #include <immer/refcount/unsafe_refcount_policy.hpp> | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_LIBRRB | ||||||
|  | extern "C" { | ||||||
|  | #define restrict __restrict__ | ||||||
|  | #include <rrb.h> | ||||||
|  | #undef restrict | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if IMMER_BENCHMARK_LIBRRB | ||||||
|  | NONIUS_BENCHMARK("librrb", benchmark_take_librrb(make_librrb_vector)) | ||||||
|  | NONIUS_BENCHMARK("librrb/F", benchmark_take_librrb(make_librrb_vector_f)) | ||||||
|  | NONIUS_BENCHMARK("l/librrb", benchmark_take_lin_librrb(make_librrb_vector)) | ||||||
|  | NONIUS_BENCHMARK("l/librrb/F", benchmark_take_lin_librrb(make_librrb_vector_f)) | ||||||
|  | NONIUS_BENCHMARK("t/librrb", benchmark_take_mut_librrb(make_librrb_vector)) | ||||||
|  | NONIUS_BENCHMARK("t/librrb/F", benchmark_take_mut_librrb(make_librrb_vector_f)) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("vector/4B", benchmark_take<immer::vector<unsigned,def_memory,4>>()) | ||||||
|  | NONIUS_BENCHMARK("vector/5B", benchmark_take<immer::vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("vector/6B", benchmark_take<immer::vector<unsigned,def_memory,6>>()) | ||||||
|  | NONIUS_BENCHMARK("vector/GC", benchmark_take<immer::vector<unsigned,gc_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("vector/NO", benchmark_take<immer::vector<unsigned,basic_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("vector/UN", benchmark_take<immer::vector<unsigned,unsafe_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("vector_s/GC", benchmark_take<immer::vector<std::size_t,gc_memory,5>>()) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("flex/F/5B", benchmark_take<immer::flex_vector<unsigned,def_memory,5>, push_front_fn>()) | ||||||
|  | NONIUS_BENCHMARK("flex/F/GC", benchmark_take<immer::flex_vector<unsigned,gc_memory,5>, push_front_fn>()) | ||||||
|  | NONIUS_BENCHMARK("flex/F/GCF", benchmark_take<immer::flex_vector<unsigned,gcf_memory,5>, push_front_fn>()) | ||||||
|  | NONIUS_BENCHMARK("flex_s/F/GC", benchmark_take<immer::flex_vector<std::size_t,gc_memory,5>, push_front_fn>()) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("l/vector/5B", benchmark_take_lin<immer::vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("l/vector/GC", benchmark_take_lin<immer::vector<unsigned,gc_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("l/vector/NO", benchmark_take_lin<immer::vector<unsigned,basic_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("l/vector/UN", benchmark_take_lin<immer::vector<unsigned,unsafe_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("l/flex/F/5B", benchmark_take_lin<immer::flex_vector<unsigned,def_memory,5>, push_front_fn>()) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("m/vector/5B", benchmark_take_move<immer::vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("m/vector/GC", benchmark_take_move<immer::vector<unsigned,gc_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("m/vector/NO", benchmark_take_move<immer::vector<unsigned,basic_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("m/vector/UN", benchmark_take_move<immer::vector<unsigned,unsafe_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("m/flex/F/5B", benchmark_take_move<immer::flex_vector<unsigned,def_memory,5>, push_front_fn>()) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("t/vector/5B", benchmark_take_mut<immer::vector<unsigned,def_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("t/vector/GC", benchmark_take_mut<immer::vector<unsigned,gc_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("t/vector/NO", benchmark_take_mut<immer::vector<unsigned,basic_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("t/vector/UN", benchmark_take_mut<immer::vector<unsigned,unsafe_memory,5>>()) | ||||||
|  | NONIUS_BENCHMARK("t/flex/F/5B", benchmark_take_mut<immer::flex_vector<unsigned,def_memory,5>, push_front_fn>()) | ||||||
							
								
								
									
										31
									
								
								third_party/immer/benchmark/vector/paper/access.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								third_party/immer/benchmark/vector/paper/access.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,31 @@ | ||||||
|  | //
 | ||||||
|  | // 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 "benchmark/vector/access.hpp" | ||||||
|  | #include <immer/flex_vector.hpp> | ||||||
|  | #include <chunkedseq/chunkedseq.hpp> | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("idx owrs", benchmark_access_idx<immer::flex_vector<unsigned,def_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("idx librrb", benchmark_access_librrb(make_librrb_vector)) | ||||||
|  | NONIUS_BENCHMARK("idx relaxed owrs", benchmark_access_idx<immer::flex_vector<unsigned,def_memory>,push_front_fn>()) | ||||||
|  | NONIUS_BENCHMARK("idx relaxed librrb", benchmark_access_librrb(make_librrb_vector_f)) | ||||||
|  | NONIUS_BENCHMARK("idx std::vector", benchmark_access_idx_std<std::vector<unsigned>>()) | ||||||
|  | NONIUS_BENCHMARK("idx chunkedseq32", benchmark_access_idx_std<pasl::data::chunkedseq::bootstrapped::deque<unsigned, 32>>()) | ||||||
|  | NONIUS_BENCHMARK("idx chunkedseq", benchmark_access_idx_std<pasl::data::chunkedseq::bootstrapped::deque<unsigned>>()) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("iter orws", benchmark_access_iter<immer::flex_vector<unsigned,def_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("iter relaxed orws", benchmark_access_iter<immer::flex_vector<unsigned,def_memory>,push_front_fn>()) | ||||||
|  | NONIUS_BENCHMARK("iter chunkedseq32", benchmark_access_iter_std<pasl::data::chunkedseq::bootstrapped::deque<unsigned, 32>>()) | ||||||
|  | NONIUS_BENCHMARK("iter chunkedseq", benchmark_access_iter_std<pasl::data::chunkedseq::bootstrapped::deque<unsigned>>()) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("reduce owrs", benchmark_access_reduce<immer::flex_vector<unsigned,def_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("reduce relaxed owrs", benchmark_access_reduce<immer::flex_vector<unsigned,def_memory>,push_front_fn>()) | ||||||
|  | NONIUS_BENCHMARK("reduce chunkedseq32", benchmark_access_reduce_chunkedseq<pasl::data::chunkedseq::bootstrapped::deque<unsigned, 32>>()) | ||||||
|  | NONIUS_BENCHMARK("reduce chunkedseq", benchmark_access_reduce_chunkedseq<pasl::data::chunkedseq::bootstrapped::deque<unsigned>>()) | ||||||
|  | NONIUS_BENCHMARK("reduce std::vector", benchmark_access_iter_std<std::vector<unsigned>>()) | ||||||
|  | NONIUS_BENCHMARK("reduce std::list", benchmark_access_iter_std<std::list<unsigned>>()) | ||||||
							
								
								
									
										40
									
								
								third_party/immer/benchmark/vector/paper/assoc-random.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								third_party/immer/benchmark/vector/paper/assoc-random.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,40 @@ | ||||||
|  | //
 | ||||||
|  | // 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 "benchmark/vector/assoc.hpp" | ||||||
|  | #include <immer/flex_vector.hpp> | ||||||
|  | #include <immer/flex_vector_transient.hpp> | ||||||
|  | #include <chunkedseq/chunkedseq.hpp> | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("ours/basic",   benchmark_assoc_random<immer::flex_vector<unsigned,basic_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("ours/safe",    benchmark_assoc_random<immer::flex_vector<unsigned,def_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("ours/unsafe",  benchmark_assoc_random<immer::flex_vector<unsigned,unsafe_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("ours/gc",      benchmark_assoc_random<immer::flex_vector<unsigned,gc_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("librrb",       benchmark_assoc_random_librrb(make_librrb_vector)) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("relaxed ours/basic",   benchmark_assoc_random<immer::flex_vector<unsigned,basic_memory>,push_front_fn>()) | ||||||
|  | NONIUS_BENCHMARK("relaxed ours/safe",    benchmark_assoc_random<immer::flex_vector<unsigned,def_memory>,push_front_fn>()) | ||||||
|  | NONIUS_BENCHMARK("relaxed ours/unsafe",  benchmark_assoc_random<immer::flex_vector<unsigned,unsafe_memory>,push_front_fn>()) | ||||||
|  | NONIUS_BENCHMARK("relaxed ours/gc",      benchmark_assoc_random<immer::flex_vector<unsigned,gc_memory>,push_front_fn>()) | ||||||
|  | NONIUS_BENCHMARK("relaxed librrb",       benchmark_assoc_random_librrb(make_librrb_vector_f)) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("transient ours/basic",   benchmark_assoc_mut_random<immer::flex_vector<unsigned,basic_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("transient ours/safe",    benchmark_assoc_mut_random<immer::flex_vector<unsigned,def_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("transient ours/unsafe",  benchmark_assoc_mut_random<immer::flex_vector<unsigned,unsafe_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("transient ours/gc",      benchmark_assoc_mut_random<immer::flex_vector<unsigned,gc_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("transient librrb",       benchmark_assoc_mut_random_librrb(make_librrb_vector)) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("transient relaxed ours/basic",   benchmark_assoc_mut_random<immer::flex_vector<unsigned,basic_memory>,push_back_fn>()) | ||||||
|  | NONIUS_BENCHMARK("transient relaxed ours/safe",    benchmark_assoc_mut_random<immer::flex_vector<unsigned,def_memory>,push_back_fn>()) | ||||||
|  | NONIUS_BENCHMARK("transient relaxed ours/unsafe",  benchmark_assoc_mut_random<immer::flex_vector<unsigned,unsafe_memory>,push_back_fn>()) | ||||||
|  | NONIUS_BENCHMARK("transient relaxed ours/gc",      benchmark_assoc_mut_random<immer::flex_vector<unsigned,gc_memory>,push_back_fn>()) | ||||||
|  | NONIUS_BENCHMARK("transient relaxed librrb",       benchmark_assoc_mut_random_librrb(make_librrb_vector_f)) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("transient std::vector",  benchmark_assoc_random_std<std::vector<unsigned>>()) | ||||||
|  | NONIUS_BENCHMARK("transient chunkedseq32", benchmark_assoc_random_std<pasl::data::chunkedseq::bootstrapped::deque<unsigned>>()) | ||||||
|  | NONIUS_BENCHMARK("transient chunkedseq",   benchmark_assoc_random_std<pasl::data::chunkedseq::bootstrapped::deque<unsigned, 32>>()) | ||||||
							
								
								
									
										40
									
								
								third_party/immer/benchmark/vector/paper/assoc.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								third_party/immer/benchmark/vector/paper/assoc.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,40 @@ | ||||||
|  | //
 | ||||||
|  | // 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 "benchmark/vector/assoc.hpp" | ||||||
|  | #include <immer/flex_vector.hpp> | ||||||
|  | #include <immer/flex_vector_transient.hpp> | ||||||
|  | #include <chunkedseq/chunkedseq.hpp> | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("ours/basic",   benchmark_assoc<immer::flex_vector<unsigned,basic_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("ours/safe",    benchmark_assoc<immer::flex_vector<unsigned,def_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("ours/unsafe",  benchmark_assoc<immer::flex_vector<unsigned,unsafe_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("ours/gc",      benchmark_assoc<immer::flex_vector<unsigned,gc_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("librrb",       benchmark_assoc_librrb(make_librrb_vector)) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("relaxed ours/basic",   benchmark_assoc<immer::flex_vector<unsigned,basic_memory>,push_front_fn>()) | ||||||
|  | NONIUS_BENCHMARK("relaxed ours/safe",    benchmark_assoc<immer::flex_vector<unsigned,def_memory>,push_front_fn>()) | ||||||
|  | NONIUS_BENCHMARK("relaxed ours/unsafe",  benchmark_assoc<immer::flex_vector<unsigned,unsafe_memory>,push_front_fn>()) | ||||||
|  | NONIUS_BENCHMARK("relaxed ours/gc",      benchmark_assoc<immer::flex_vector<unsigned,gc_memory>,push_front_fn>()) | ||||||
|  | NONIUS_BENCHMARK("relaxed librrb",       benchmark_assoc_librrb(make_librrb_vector_f)) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("transient ours/basic",   benchmark_assoc_mut<immer::flex_vector<unsigned,basic_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("transient ours/safe",    benchmark_assoc_mut<immer::flex_vector<unsigned,def_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("transient ours/unsafe",  benchmark_assoc_mut<immer::flex_vector<unsigned,unsafe_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("transient ours/gc",      benchmark_assoc_mut<immer::flex_vector<unsigned,gc_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("transient librrb",       benchmark_assoc_mut_librrb(make_librrb_vector)) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("transient relaxed ours/basic",   benchmark_assoc_mut<immer::flex_vector<unsigned,basic_memory>,push_back_fn>()) | ||||||
|  | NONIUS_BENCHMARK("transient relaxed ours/safe",    benchmark_assoc_mut<immer::flex_vector<unsigned,def_memory>,push_back_fn>()) | ||||||
|  | NONIUS_BENCHMARK("transient relaxed ours/unsafe",  benchmark_assoc_mut<immer::flex_vector<unsigned,unsafe_memory>,push_back_fn>()) | ||||||
|  | NONIUS_BENCHMARK("transient relaxed ours/gc",      benchmark_assoc_mut<immer::flex_vector<unsigned,gc_memory>,push_back_fn>()) | ||||||
|  | NONIUS_BENCHMARK("transient relaxed librrb",       benchmark_assoc_mut_librrb(make_librrb_vector_f)) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("transient std::vector",  benchmark_assoc_std<std::vector<unsigned>>()) | ||||||
|  | NONIUS_BENCHMARK("transient chunkedseq32", benchmark_assoc_std<pasl::data::chunkedseq::bootstrapped::deque<unsigned, 32>>()) | ||||||
|  | NONIUS_BENCHMARK("transient chunkedseq",   benchmark_assoc_std<pasl::data::chunkedseq::bootstrapped::deque<unsigned>>()) | ||||||
							
								
								
									
										22
									
								
								third_party/immer/benchmark/vector/paper/concat.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								third_party/immer/benchmark/vector/paper/concat.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,22 @@ | ||||||
|  | //
 | ||||||
|  | // 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 "benchmark/vector/concat.hpp" | ||||||
|  | #include <immer/flex_vector.hpp> | ||||||
|  | #include <immer/flex_vector_transient.hpp> | ||||||
|  | #include <chunkedseq/chunkedseq.hpp> | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("ours/basic",   benchmark_concat_incr<immer::flex_vector<unsigned,basic_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("ours/safe",    benchmark_concat_incr<immer::flex_vector<unsigned,def_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("ours/unsafe",  benchmark_concat_incr<immer::flex_vector<unsigned,unsafe_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("ours/gc",      benchmark_concat_incr<immer::flex_vector<unsigned,gc_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("librrb",       benchmark_concat_incr_librrb(make_librrb_vector)) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("transient ours/gc",      benchmark_concat_incr_mut<immer::flex_vector<unsigned,gc_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("transient chunkedseq32", benchmark_concat_incr_chunkedseq<pasl::data::chunkedseq::bootstrapped::deque<unsigned, 32>>()) | ||||||
|  | NONIUS_BENCHMARK("transient chunkedseq",   benchmark_concat_incr_chunkedseq<pasl::data::chunkedseq::bootstrapped::deque<unsigned>>()) | ||||||
							
								
								
									
										28
									
								
								third_party/immer/benchmark/vector/paper/push.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								third_party/immer/benchmark/vector/paper/push.cpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,28 @@ | ||||||
|  | //
 | ||||||
|  | // 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 "benchmark/vector/push.hpp" | ||||||
|  | #include <immer/flex_vector.hpp> | ||||||
|  | #include <immer/flex_vector_transient.hpp> | ||||||
|  | #include <chunkedseq/chunkedseq.hpp> | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("ours/basic",   benchmark_push<immer::flex_vector<unsigned,basic_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("ours/safe",    benchmark_push<immer::flex_vector<unsigned,def_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("ours/unsafe",  benchmark_push<immer::flex_vector<unsigned,unsafe_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("ours/gc",      benchmark_push<immer::flex_vector<unsigned,gc_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("librrb",       benchmark_push_librrb) | ||||||
|  | 
 | ||||||
|  | NONIUS_BENCHMARK("transient ours/basic",   benchmark_push_mut<immer::flex_vector<unsigned,basic_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("transient ours/safe",    benchmark_push_mut<immer::flex_vector<unsigned,def_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("transient ours/unsafe",  benchmark_push_mut<immer::flex_vector<unsigned,unsafe_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("transient ours/gc",      benchmark_push_mut<immer::flex_vector<unsigned,gc_memory>>()) | ||||||
|  | NONIUS_BENCHMARK("transient librrb",       benchmark_push_mut_librrb) | ||||||
|  | NONIUS_BENCHMARK("transient std::vector",  benchmark_push_mut_std<std::vector<unsigned>>()) | ||||||
|  | NONIUS_BENCHMARK("transient std::list",    benchmark_push_mut_std<std::list<unsigned>>()) | ||||||
|  | NONIUS_BENCHMARK("transient chunkedseq32", benchmark_push_mut_std<pasl::data::chunkedseq::bootstrapped::deque<unsigned, 32>>()) | ||||||
|  | NONIUS_BENCHMARK("transient chunkedseq",   benchmark_push_mut_std<pasl::data::chunkedseq::bootstrapped::deque<unsigned>>()) | ||||||
							
								
								
									
										111
									
								
								third_party/immer/benchmark/vector/push.hpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										111
									
								
								third_party/immer/benchmark/vector/push.hpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,111 @@ | ||||||
|  | //
 | ||||||
|  | // 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
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include "benchmark/vector/common.hpp" | ||||||
|  | 
 | ||||||
|  | namespace { | ||||||
|  | 
 | ||||||
|  | template <typename Vektor> | ||||||
|  | auto benchmark_push_mut_std() | ||||||
|  | { | ||||||
|  |     return [] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  |         if (n > get_limit<Vektor>{}) | ||||||
|  |             nonius::skip(); | ||||||
|  | 
 | ||||||
|  |         measure(meter, [&] { | ||||||
|  |             auto v = Vektor{}; | ||||||
|  |             for (auto i = 0u; i < n; ++i) | ||||||
|  |                 v.push_back(i); | ||||||
|  |             return v; | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Vektor> | ||||||
|  | auto benchmark_push_mut() | ||||||
|  | { | ||||||
|  |     return [] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  |         if (n > get_limit<Vektor>{}) | ||||||
|  |             nonius::skip(); | ||||||
|  | 
 | ||||||
|  |         measure(meter, [&] { | ||||||
|  |             auto v = Vektor{}.transient(); | ||||||
|  |             for (auto i = 0u; i < n; ++i) | ||||||
|  |                 v.push_back(i); | ||||||
|  |             return v; | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Vektor> | ||||||
|  | auto benchmark_push_move() | ||||||
|  | { | ||||||
|  |     return [] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  |         if (n > get_limit<Vektor>{}) | ||||||
|  |             nonius::skip(); | ||||||
|  | 
 | ||||||
|  |         measure(meter, [&] { | ||||||
|  |             auto v = Vektor{}; | ||||||
|  |             for (auto i = 0u; i < n; ++i) | ||||||
|  |                 v = std::move(v).push_back(i); | ||||||
|  |             return v; | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Vektor> | ||||||
|  | auto benchmark_push() | ||||||
|  | { | ||||||
|  |     return [] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  |         if (n > get_limit<Vektor>{}) | ||||||
|  |             nonius::skip(); | ||||||
|  | 
 | ||||||
|  |         measure(meter, [&] { | ||||||
|  |             auto v = Vektor{}; | ||||||
|  |             for (auto i = 0u; i < n; ++i) | ||||||
|  |                 v = v.push_back(i); | ||||||
|  |             return v; | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | auto benchmark_push_librrb(nonius::chronometer meter) | ||||||
|  | { | ||||||
|  |     auto n = meter.param<N>(); | ||||||
|  | 
 | ||||||
|  |     measure(meter, [&] { | ||||||
|  |         auto v = rrb_create(); | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v = rrb_push(v, reinterpret_cast<void*>(i)); | ||||||
|  |         return v; | ||||||
|  |     }); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | auto benchmark_push_mut_librrb(nonius::chronometer meter) | ||||||
|  | { | ||||||
|  |     auto n = meter.param<N>(); | ||||||
|  | 
 | ||||||
|  |     measure(meter, [&] { | ||||||
|  |         auto v = rrb_to_transient(rrb_create()); | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v = transient_rrb_push(v, reinterpret_cast<void*>(i)); | ||||||
|  |         return v; | ||||||
|  |     }); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | } // anonymous namespace
 | ||||||
							
								
								
									
										46
									
								
								third_party/immer/benchmark/vector/push_front.hpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								third_party/immer/benchmark/vector/push_front.hpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,46 @@ | ||||||
|  | //
 | ||||||
|  | // 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
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include "benchmark/vector/common.hpp" | ||||||
|  | 
 | ||||||
|  | namespace { | ||||||
|  | 
 | ||||||
|  | template <typename Vektor> | ||||||
|  | auto bechmark_push_front() | ||||||
|  | { | ||||||
|  |     return [] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  | 
 | ||||||
|  |         measure(meter, [&] { | ||||||
|  |             auto v = Vektor{}; | ||||||
|  |             for (auto i = 0u; i < n; ++i) | ||||||
|  |                 v = v.push_front(i); | ||||||
|  |             return v; | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | auto benchmark_push_front_librrb(nonius::chronometer meter) | ||||||
|  | { | ||||||
|  |     auto n = meter.param<N>(); | ||||||
|  | 
 | ||||||
|  |     measure(meter, [&] { | ||||||
|  |         auto v = rrb_create(); | ||||||
|  |         for (auto i = 0u; i < n; ++i) { | ||||||
|  |             auto f = rrb_push(rrb_create(), | ||||||
|  |                               reinterpret_cast<void*>(i)); | ||||||
|  |             v = rrb_concat(f, v); | ||||||
|  |         } | ||||||
|  |         return v; | ||||||
|  |     }); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | } // anonymous namespace
 | ||||||
							
								
								
									
										144
									
								
								third_party/immer/benchmark/vector/take.hpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								third_party/immer/benchmark/vector/take.hpp
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,144 @@ | ||||||
|  | //
 | ||||||
|  | // 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
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include "benchmark/vector/common.hpp" | ||||||
|  | 
 | ||||||
|  | namespace { | ||||||
|  | 
 | ||||||
|  | template <typename Vektor, | ||||||
|  |           typename PushFn=push_back_fn> | ||||||
|  | auto benchmark_take() | ||||||
|  | { | ||||||
|  |     return [] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  | 
 | ||||||
|  |         auto v = Vektor{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v = PushFn{}(std::move(v), i); | ||||||
|  | 
 | ||||||
|  |         measure(meter, [&] { | ||||||
|  |             for (auto i = 0u; i < n; ++i) | ||||||
|  |                 (void) v.take(i); | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Vektor, | ||||||
|  |           typename PushFn=push_back_fn> | ||||||
|  | auto benchmark_take_lin() | ||||||
|  | { | ||||||
|  |     return [] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  | 
 | ||||||
|  |         auto v = Vektor{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v = PushFn{}(std::move(v), i); | ||||||
|  | 
 | ||||||
|  |         measure(meter, [&] { | ||||||
|  |             auto r = v; | ||||||
|  |             for (auto i = n; i > 0; --i) | ||||||
|  |                 r = r.take(i); | ||||||
|  |             return r; | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Vektor, | ||||||
|  |           typename PushFn=push_back_fn> | ||||||
|  | auto benchmark_take_move() | ||||||
|  | { | ||||||
|  |     return [] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  | 
 | ||||||
|  |         auto v = Vektor{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             v = PushFn{}(std::move(v), i); | ||||||
|  | 
 | ||||||
|  |         measure(meter, [&] { | ||||||
|  |             auto r = v; | ||||||
|  |             for (auto i = n; i > 0; --i) | ||||||
|  |                 r = std::move(r).take(i); | ||||||
|  |             return r; | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Vektor, | ||||||
|  |           typename PushFn=push_back_fn> | ||||||
|  | auto benchmark_take_mut() | ||||||
|  | { | ||||||
|  |     return [] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  | 
 | ||||||
|  |         auto vv = Vektor{}; | ||||||
|  |         for (auto i = 0u; i < n; ++i) | ||||||
|  |             vv = PushFn{}(std::move(vv), i); | ||||||
|  | 
 | ||||||
|  |         measure(meter, [&] { | ||||||
|  |             auto v = vv.transient(); | ||||||
|  |             for (auto i = n; i > 0; --i) | ||||||
|  |                 (void) v.take(i); | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Fn> | ||||||
|  | auto benchmark_take_librrb(Fn make) | ||||||
|  | { | ||||||
|  |     return [=] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  |         auto v = make(n); | ||||||
|  |         measure(meter, [&] { | ||||||
|  |                 for (auto i = 0u; i < n; ++i) | ||||||
|  |                     rrb_slice(v, 0, i); | ||||||
|  |             }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Fn> | ||||||
|  | auto benchmark_take_lin_librrb(Fn make) | ||||||
|  | { | ||||||
|  |     return [=] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  |         auto v = make(n); | ||||||
|  |         measure( | ||||||
|  |             meter, [&] { | ||||||
|  |                 auto r = v; | ||||||
|  |                 for (auto i = n; i > 0; --i) | ||||||
|  |                     r = rrb_slice(r, 0, i); | ||||||
|  |                 return r; | ||||||
|  |             }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Fn> | ||||||
|  | auto benchmark_take_mut_librrb(Fn make) | ||||||
|  | { | ||||||
|  |     return [=] (nonius::chronometer meter) | ||||||
|  |     { | ||||||
|  |         auto n = meter.param<N>(); | ||||||
|  |         auto v = make(n); | ||||||
|  |         measure( | ||||||
|  |             meter, [&] { | ||||||
|  |                 auto r = rrb_to_transient(v); | ||||||
|  |                 for (auto i = n; i > 0; --i) | ||||||
|  |                     r = transient_rrb_slice(r, 0, i); | ||||||
|  |                 return r; | ||||||
|  |             }); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | } // anonymous namespace
 | ||||||
							
								
								
									
										108
									
								
								third_party/immer/cmake/FindBoehmGC.cmake
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								third_party/immer/cmake/FindBoehmGC.cmake
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,108 @@ | ||||||
|  | # - Try to find Boehm GC | ||||||
|  | #   Once done, this will define | ||||||
|  | # | ||||||
|  | #   BOEHM_GC_FOUND - system has Boehm GC | ||||||
|  | #   BOEHM_GC_INCLUDE_DIR - the Boehm GC include directories | ||||||
|  | #   BOEHM_GC_LIBRARIES - link these to use Boehm GC | ||||||
|  | #  | ||||||
|  | #   Copyright (c) 2010-2015  Takashi Kato <ktakashi@ymail.com> | ||||||
|  | #  | ||||||
|  | #   Redistribution and use in source and binary forms, with or without | ||||||
|  | #   modification, are permitted provided that the following conditions | ||||||
|  | #   are met: | ||||||
|  | #  | ||||||
|  | #   1. Redistributions of source code must retain the above copyright | ||||||
|  | #      notice, this list of conditions and the following disclaimer. | ||||||
|  | #  | ||||||
|  | #   2. Redistributions in binary form must reproduce the above copyright | ||||||
|  | #      notice, this list of conditions and the following disclaimer in the | ||||||
|  | #      documentation and/or other materials provided with the distribution. | ||||||
|  | #  | ||||||
|  | #   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | #   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | #   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||||
|  | #   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||||
|  | #   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||||
|  | #   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED | ||||||
|  | #   TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | ||||||
|  | #   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | ||||||
|  | #   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | ||||||
|  | #   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||||
|  | #   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | #  | ||||||
|  | #  $Id: $ | ||||||
|  | #  | ||||||
|  | 
 | ||||||
|  | # CMake module to find Boehm GC | ||||||
|  | 
 | ||||||
|  | # use pkg-config if available | ||||||
|  | FIND_PACKAGE(PkgConfig) | ||||||
|  | PKG_CHECK_MODULES(PC_BDW_GC QUIET bdw-gc) | ||||||
|  | 
 | ||||||
|  | # try newer one first in case of gc.h is overwritten. | ||||||
|  | FIND_PATH(BOEHM_GC_INCLUDE_DIR gc/gc.h | ||||||
|  |   HINTS ${PC_BDW_GC_INCLUDEDIR} ${PC_BDW_GC_INCLUDE_DIRS}) | ||||||
|  | 
 | ||||||
|  | IF (NOT BOEHM_GC_INCLUDE_DIR) | ||||||
|  |   FIND_PATH(BOEHM_GC_INCLUDE_DIR gc.h | ||||||
|  |     HINTS ${PC_BDW_GC_INCLUDEDIR} ${PC_BDW_GC_INCLUDE_DIRS}) | ||||||
|  |   IF (BOEHM_GC_INCLUDE_DIR) | ||||||
|  |     SET(HAVE_GC_H TRUE) | ||||||
|  |   ENDIF() | ||||||
|  | ELSE() | ||||||
|  |   SET(HAVE_GC_GC_H TRUE) | ||||||
|  | ENDIF() | ||||||
|  | 
 | ||||||
|  | # For FreeBSD we need to use gc-threaded | ||||||
|  | IF (${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD") | ||||||
|  |   # checks if 'gc' supports 'GC_get_parallel' and if it does | ||||||
|  |   # then use it | ||||||
|  |   INCLUDE(${CMAKE_ROOT}/Modules/CheckCSourceCompiles.cmake) | ||||||
|  |   # not sure if this links properly... | ||||||
|  |   FIND_LIBRARY(BOEHM_GC_LIBRARIES NAMES gc | ||||||
|  |     HINTS ${PC_BDW_GC_LIBDIR} ${PC_BDW_GC_LIBRARY_DIRS}) | ||||||
|  |   MESSAGE(STATUS "GC library ${BOEHM_GC_LIBRARIES}") | ||||||
|  |   SET(CMAKE_REQUIRED_LIBRARIES "gc") | ||||||
|  |   SET(CMAKE_REQUIRED_DEFINITIONS "-DGC_THREADS") | ||||||
|  |   SET(CMAKE_REQUIRED_INCLUDES "${BOEHM_GC_INCLUDE_DIR}") | ||||||
|  |   SET(CMAKE_REQUIRED_FLAGS "-L${PC_BDW_GC_LIBRARY_DIRS}") | ||||||
|  |   MESSAGE(STATUS "Boehm GC include dir: ${CMAKE_REQUIRED_INCLUDES}") | ||||||
|  |   CHECK_C_SOURCE_RUNS( | ||||||
|  |     "#include <gc.h> | ||||||
|  | int main() { | ||||||
|  | int i= GC_get_parallel(); | ||||||
|  | return 0; | ||||||
|  | } | ||||||
|  | " GC_GET_PARALLEL_WORKS) | ||||||
|  |   IF (NOT GC_GET_PARALLEL_WORKS) | ||||||
|  |     MESSAGE(STATUS "Try gc-threaded") | ||||||
|  | 
 | ||||||
|  |     # bdw-gc-threaded is the proper name for FreeBSD pkg-config | ||||||
|  |     PKG_CHECK_MODULES(PC_BDW_GC_THREADED bdw-gc-threaded) | ||||||
|  |     FIND_LIBRARY(BOEHM_GC_THREADED_LIBRARIES NAMES gc-threaded | ||||||
|  |       HINTS ${PC_BDW_GC_THREADED_LIBDIR} ${PC_BDW_GC_THREADED_THREADED_DIRS}) | ||||||
|  | 
 | ||||||
|  |     MESSAGE(STATUS "GC threaded library ${BOEHM_GC_THREADED_LIBRARIES}") | ||||||
|  |     IF (BOEHM_GC_THREADED_LIBRARIES) | ||||||
|  |       # OK just use it | ||||||
|  |       SET(BOEHM_GC_LIBRARIES "${BOEHM_GC_THREADED_LIBRARIES}") | ||||||
|  |     ENDIF() | ||||||
|  |   ENDIF() | ||||||
|  | ELSE() | ||||||
|  |   FIND_LIBRARY(BOEHM_GC_LIBRARIES NAMES gc | ||||||
|  |     HINTS ${PC_BDW_GC_LIBDIR} ${PC_BDW_GC_LIBRARY_DIRS}) | ||||||
|  |   # OpenSolaris uses bgc as Boehm GC runtime in its package manager. | ||||||
|  |   # so try it | ||||||
|  |   IF (NOT BOEHM_GC_LIBRARIES) | ||||||
|  |     FIND_LIBRARY(BOEHM_GC_LIBRARIES NAMES bgc | ||||||
|  |       HINTS ${PC_BDW_GC_LIBDIR} ${PC_BDW_GC_LIBRARY_DIRS}) | ||||||
|  |   ENDIF() | ||||||
|  | ENDIF() | ||||||
|  | 
 | ||||||
|  | MESSAGE(STATUS "Found GC library: ${BOEHM_GC_LIBRARIES}") | ||||||
|  | 
 | ||||||
|  | INCLUDE(FindPackageHandleStandardArgs) | ||||||
|  | FIND_PACKAGE_HANDLE_STANDARD_ARGS(Boehm_GC DEFAULT_MSG | ||||||
|  |                                   BOEHM_GC_LIBRARIES BOEHM_GC_INCLUDE_DIR) | ||||||
|  | 
 | ||||||
|  | MARK_AS_ADVANCED(BOEHM_GC_LIBRARIES BOEHM_GC_INCLUDE_DIR) | ||||||
							
								
								
									
										326
									
								
								third_party/immer/cmake/FindGuile.cmake
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										326
									
								
								third_party/immer/cmake/FindGuile.cmake
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,326 @@ | ||||||
|  | #[[.rst | ||||||
|  | # | ||||||
|  | # FindGuile | ||||||
|  | # --------- | ||||||
|  | # Find the development libraries for Guile. | ||||||
|  | # | ||||||
|  | # Exported Vars | ||||||
|  | # ~~~~~~~~~~~~~ | ||||||
|  | # | ||||||
|  | # .. variable:: Guile_FOUND | ||||||
|  | # | ||||||
|  | #    Set to *true* if Guile was found. | ||||||
|  | # | ||||||
|  | # .. variable:: Guile_INCLUDE_DIRS | ||||||
|  | # | ||||||
|  | #    A list of include directories. | ||||||
|  | # | ||||||
|  | # .. variable:: Guile_LIBRARIES | ||||||
|  | # | ||||||
|  | #    A list of libraries needed to build you project. | ||||||
|  | # | ||||||
|  | # .. variable:: Guile_VERSION_STRING | ||||||
|  | # | ||||||
|  | #    Guile full version. | ||||||
|  | # | ||||||
|  | # .. variable:: Guile_VERSION_MAJOR | ||||||
|  | # | ||||||
|  | #    Guile major version. | ||||||
|  | # | ||||||
|  | # .. variable:: Guile_VERSION_MINOR | ||||||
|  | # | ||||||
|  | #    Guile minor version. | ||||||
|  | # | ||||||
|  | # .. variable:: Guile_VERSION_PATCH | ||||||
|  | # | ||||||
|  | #    Guile patch version. | ||||||
|  | # | ||||||
|  | # .. variable:: Guile_EXECUTABLE | ||||||
|  | # | ||||||
|  | #    Guile executable (optional). | ||||||
|  | # | ||||||
|  | # .. variable:: Guile_CONFIG_EXECUTABLE | ||||||
|  | # | ||||||
|  | #    Guile configuration executable (optional). | ||||||
|  | # | ||||||
|  | # .. variable:: Guile_ROOT_DIR | ||||||
|  | # | ||||||
|  | #    Guile installation root dir (optional). | ||||||
|  | # | ||||||
|  | # .. variable:: Guile_SITE_DIR | ||||||
|  | # | ||||||
|  | #    Guile installation module site dir (optional). | ||||||
|  | # | ||||||
|  | # .. variable:: Guile_EXTENSION_DIR | ||||||
|  | # | ||||||
|  | #    Guile installation extension dir (optional). | ||||||
|  | # | ||||||
|  | # Control VARS | ||||||
|  | # ~~~~~~~~~~~~ | ||||||
|  | # :envvar:`Guile_ROOT_DIR` | ||||||
|  | # | ||||||
|  | #   Use this variable to provide hints to :filename:`find_{*}` commands, | ||||||
|  | #   you may pass it to :command:`cmake` or set the environtment variable. | ||||||
|  | # | ||||||
|  | # .. code-block:: cmake | ||||||
|  | # | ||||||
|  | #    % cmake . -Bbuild -DGuile_ROOT_DIR=<extra-path> | ||||||
|  | # | ||||||
|  | #    # or | ||||||
|  | #    % export Guile_ROOT_DIR=<extra-path>; | ||||||
|  | #    % cmake . -Bbuild | ||||||
|  | # | ||||||
|  | #    # or | ||||||
|  | #    % Guile_ROOT_DIR=<extra-path> cmake . -Bbuild | ||||||
|  | # | ||||||
|  | # | ||||||
|  | #]] | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #[[.rst | ||||||
|  | # | ||||||
|  | # Copyright © 2016, Edelcides Gonçalves <eatg75 |0x40| gmail> | ||||||
|  | # | ||||||
|  | # Permission to use, copy, modify, and/or distribute this software for | ||||||
|  | # any purpose with or without fee is hereby granted, provided that the | ||||||
|  | # above copyright notice and this permission notice appear in all | ||||||
|  | # copies. | ||||||
|  | # | ||||||
|  | # *THE SOFTWARE IS PROVIDED* **AS IS** *AND ISC DISCLAIMS ALL | ||||||
|  | # WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED | ||||||
|  | # WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE | ||||||
|  | # LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES | ||||||
|  | # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR | ||||||
|  | # PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER | ||||||
|  | # TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | ||||||
|  | # PERFORMANCE OF THIS SOFTWARE*. | ||||||
|  | # | ||||||
|  | # This file is not part of CMake | ||||||
|  | # | ||||||
|  | #]] | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | include (SelectLibraryConfigurations) | ||||||
|  | include (FindPackageHandleStandardArgs) | ||||||
|  | 
 | ||||||
|  | function (_guile_find_component_include_dir component header) | ||||||
|  |   find_path ("${component}_INCLUDE_DIR" | ||||||
|  |     ${header} | ||||||
|  |     HINTS | ||||||
|  |     "${GUile_ROOT_DIR}" | ||||||
|  |     ENV Guile_ROOT_DIR | ||||||
|  |     PATH_SUFFIXES | ||||||
|  |     Guile guile Guile-2.0 guile-2.0 Guile/2.0 guile/2.0 GC | ||||||
|  |     gc) | ||||||
|  | 
 | ||||||
|  |   set ("${component}_INCLUDE_DIR" "${${component}_INCLUDE_DIR}" | ||||||
|  |     PARENT_SCOPE) | ||||||
|  | endfunction () | ||||||
|  | 
 | ||||||
|  | function (_guile_find_component_library component_name component) | ||||||
|  | 
 | ||||||
|  |   find_library ("${component_name}_LIBRARY_RELEASE" | ||||||
|  |     NAMES "${component}" "${component}-2.0" | ||||||
|  |     HINTS | ||||||
|  |     "${GUile_ROOT_DIR}" | ||||||
|  |     ENV Guile_ROOT_DIR | ||||||
|  |     PATHS | ||||||
|  |     /usr/lib/${CMAKE_LIBRARY_ARCHITECTURE} | ||||||
|  |     /usr/lib64/${CMAKE_LIBRARY_ARCHITECTURE} | ||||||
|  |     /usr/lib32/${CMAKE_LIBRARY_ARCHITECTURE}) | ||||||
|  | 
 | ||||||
|  |   if  (${component_name}_LIBRARY_RELEASE) | ||||||
|  |     select_library_configurations (${component_name}) | ||||||
|  |     set ("${component_name}_LIBRARY_RELEASE" | ||||||
|  |       "${${component_name}_LIBRARY_RELEASE}" PARENT_SCOPE) | ||||||
|  |     set ("${component_name}_LIBRARY" | ||||||
|  |       "${${component_name}_LIBRARY}" PARENT_SCOPE) | ||||||
|  |     set ("${component_name}_LIBRARIES" | ||||||
|  |       "${${component_name}_LIBRARIES}" PARENT_SCOPE) | ||||||
|  |   endif () | ||||||
|  | endfunction () | ||||||
|  | 
 | ||||||
|  | function (_guile_find_version_2 header_file macro_name) | ||||||
|  |   file (STRINGS "${header_file}" _VERSION | ||||||
|  |     REGEX "#define[\t ]+${macro_name}[\t ]+[0-9]+") | ||||||
|  | 
 | ||||||
|  |   if (_VERSION) | ||||||
|  |     string (REGEX REPLACE | ||||||
|  |       ".*#define[\t ]+${macro_name}[\t ]+([0-9]+).*" | ||||||
|  |       "\\1" _VERSION_VALUE "${_VERSION}") | ||||||
|  |     if ("${_VERSION}" STREQUAL "${_VERSION_VALUE}") | ||||||
|  |       set (_VERSION_FOUND 0 PARENT_SCOPE) | ||||||
|  |     else () | ||||||
|  |       set (_VERSION_FOUND 1 PARENT_SCOPE) | ||||||
|  |       set (_VERSION "${_VERSION_VALUE}" PARENT_SCOPE) | ||||||
|  |     endif () | ||||||
|  |   else () | ||||||
|  |     set (_VERSION_FOUND 0 PARENT_SCOPE) | ||||||
|  |   endif () | ||||||
|  | endfunction () | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ##### Entry Point ##### | ||||||
|  | 
 | ||||||
|  | set (Guile_FOUND) | ||||||
|  | set (Guile_INCLUDE_DIRS) | ||||||
|  | set (Guile_LIBRARIES) | ||||||
|  | set (Guile_VERSION_STRING) | ||||||
|  | set (Guile_VERSION_MAJOR) | ||||||
|  | set (Guile_VERSION_MINOR) | ||||||
|  | set (Guile_VERSION_PATCH) | ||||||
|  | set (Guile_EXECUTABLE) | ||||||
|  | 
 | ||||||
|  | _guile_find_component_include_dir (Guile "libguile.h") | ||||||
|  | if (Guile_INCLUDE_DIR) | ||||||
|  |   _guile_find_version_2 ("${Guile_INCLUDE_DIR}/libguile/version.h" | ||||||
|  |     SCM_MAJOR_VERSION) | ||||||
|  |   if (_VERSION_FOUND) | ||||||
|  |     set (Guile_VERSION_MAJOR "${_VERSION}") | ||||||
|  |   else () | ||||||
|  |     message (FATAL_ERROR "FindGuile: Failed to find Guile_MAJOR_VERSION.") | ||||||
|  |   endif () | ||||||
|  | 
 | ||||||
|  |   _guile_find_version_2 ("${Guile_INCLUDE_DIR}/libguile/version.h" | ||||||
|  |     SCM_MINOR_VERSION) | ||||||
|  |   if (_VERSION_FOUND) | ||||||
|  |     set (Guile_VERSION_MINOR "${_VERSION}") | ||||||
|  |   else () | ||||||
|  |     message (FATAL_ERROR "FindGuile: Failed to find Guile_MINOR_VERSION.") | ||||||
|  |   endif () | ||||||
|  | 
 | ||||||
|  |   _guile_find_version_2 ("${Guile_INCLUDE_DIR}/libguile/version.h" | ||||||
|  |     SCM_MICRO_VERSION) | ||||||
|  |   if (_VERSION_FOUND) | ||||||
|  |     set (Guile_VERSION_PATCH "${_VERSION}") | ||||||
|  |   else () | ||||||
|  |     message (FATAL_ERROR "FindGuile: Failed to find Guile_MICRO_VERSION.") | ||||||
|  |   endif () | ||||||
|  |   set (Guile_VERSION_STRING "${Guile_VERSION_MAJOR}.${Guile_VERSION_MINOR}.${Guile_VERSION_PATCH}") | ||||||
|  | 
 | ||||||
|  |   unset (_VERSION_FOUND) | ||||||
|  |   unset (_VERSION) | ||||||
|  | endif () | ||||||
|  | 
 | ||||||
|  | _guile_find_component_include_dir (Guile_GC "gc.h") | ||||||
|  | _guile_find_component_library (Guile guile) | ||||||
|  | _guile_find_component_library (Guile_GC gc) | ||||||
|  | 
 | ||||||
|  | find_program (Guile_EXECUTABLE | ||||||
|  |   guile | ||||||
|  |   DOC "Guile executable.") | ||||||
|  | 
 | ||||||
|  | if (Guile_EXECUTABLE) | ||||||
|  |   execute_process (COMMAND ${Guile_EXECUTABLE} --version | ||||||
|  |     RESULT_VARIABLE _status | ||||||
|  |     OUTPUT_VARIABLE _output | ||||||
|  |     OUTPUT_STRIP_TRAILING_WHITESPACE) | ||||||
|  | 
 | ||||||
|  |   string (REGEX REPLACE ".*\\(GNU Guile\\)[\t ]+([0-9]+)\\..*" "\\1" | ||||||
|  |     _guile_ver_major "${_output}") | ||||||
|  | 
 | ||||||
|  |   string (REGEX REPLACE ".*\\(GNU Guile\\)[\t ]+[0-9]+\\.([0-9]+).*" "\\1" | ||||||
|  |     _guile_ver_minor "${_output}") | ||||||
|  | 
 | ||||||
|  |   string (REGEX REPLACE ".*\\(GNU Guile\\)[\t ]+[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" | ||||||
|  |     _guile_ver_patch "${_output}") | ||||||
|  | 
 | ||||||
|  |   set (_version "${_guile_ver_major}.${_guile_ver_minor}.${_guile_ver_patch}") | ||||||
|  | 
 | ||||||
|  |   if (NOT Guile_FIND_QUIETLY) | ||||||
|  |     if (NOT Guile_VERSION_STRING STREQUAL _version) | ||||||
|  |       message (WARNING "FindGuile: Versions provided by library differs from the one provided by executable.") | ||||||
|  |     endif () | ||||||
|  | 
 | ||||||
|  |     if (NOT _status STREQUAL "0") | ||||||
|  |       message (WARNING "FindGuile: guile (1) process exited abnormally.") | ||||||
|  |     endif () | ||||||
|  |   endif () | ||||||
|  | 
 | ||||||
|  |   unset (_version) | ||||||
|  |   unset (_status) | ||||||
|  |   unset (_version) | ||||||
|  |   unset (_guile_ver_major) | ||||||
|  |   unset (_guile_ver_minor) | ||||||
|  |   unset (_guile_ver_patch) | ||||||
|  | endif () | ||||||
|  | 
 | ||||||
|  | find_package_handle_standard_args (GC | ||||||
|  |   "FindGuile: Failed to find dependency GC." | ||||||
|  |   Guile_GC_INCLUDE_DIR | ||||||
|  |   Guile_GC_LIBRARY | ||||||
|  |   Guile_GC_LIBRARIES | ||||||
|  |   Guile_GC_LIBRARY_RELEASE) | ||||||
|  | 
 | ||||||
|  | find_package_handle_standard_args (Guile | ||||||
|  |   REQUIRED_VARS | ||||||
|  |   Guile_INCLUDE_DIR | ||||||
|  |   Guile_LIBRARY | ||||||
|  |   Guile_LIBRARIES | ||||||
|  |   Guile_LIBRARY_RELEASE | ||||||
|  |   GC_FOUND | ||||||
|  |   VERSION_VAR Guile_VERSION_STRING) | ||||||
|  | 
 | ||||||
|  | if (Guile_FOUND) | ||||||
|  |   list (APPEND Guile_INCLUDE_DIRS "${Guile_INCLUDE_DIR}" | ||||||
|  |     "${Guile_GC_INCLUDE_DIR}") | ||||||
|  | 
 | ||||||
|  |   if (NOT TARGET Guile::Library AND NOT TARGET GC::Library) | ||||||
|  |     add_library (Guile::GC::Library UNKNOWN IMPORTED) | ||||||
|  |     set_property (TARGET Guile::GC::Library APPEND | ||||||
|  |       PROPERTY IMPORTED_CONFIGURATIONS RELEASE) | ||||||
|  | 
 | ||||||
|  |     set_target_properties (Guile::GC::Library | ||||||
|  |       PROPERTIES | ||||||
|  |       INTERFACE_INCLUDE_DIRS | ||||||
|  |       "${Guile_GC_INCLUDE_DIR}" | ||||||
|  |       IMPORTED_LOCATION | ||||||
|  |       "${Guile_GC_LIBRARY}" | ||||||
|  |       IMPORTED_LOCATION_RELEASE | ||||||
|  |       "${Guile_GC_LIBRARY_RELEASE}") | ||||||
|  | 
 | ||||||
|  |     add_library (Guile::Library UNKNOWN IMPORTED) | ||||||
|  |     set_property (TARGET Guile::Library APPEND | ||||||
|  |       PROPERTY IMPORTED_CONFIGURATIONS RELEASE) | ||||||
|  |     set_property (TARGET Guile::Library APPEND | ||||||
|  |       PROPERTY | ||||||
|  |       INTERFACE_LINK_LIBRARIES | ||||||
|  |       Guile::GC::Library) | ||||||
|  | 
 | ||||||
|  |     set_target_properties (Guile::Library | ||||||
|  |       PROPERTIES | ||||||
|  |       INTERFACE_INCLUDE_DIRSr | ||||||
|  |       "${Guile_INCLUDE_DIR}" | ||||||
|  |       IMPORTED_LOCATION "${Guile_LIBRARY}" | ||||||
|  |       IMPORTED_LOCATION_RELEASE | ||||||
|  |       "${Guile_LIBRARY_RELEASE}") | ||||||
|  | 
 | ||||||
|  |     set (Guile_LIBRARIES Guile::Library Guile::GC::Library) | ||||||
|  |   endif () | ||||||
|  | endif () | ||||||
|  | 
 | ||||||
|  | find_program(Guile_CONFIG_EXECUTABLE | ||||||
|  |   NAMES guile-config | ||||||
|  |   DOC "Guile configutration binary") | ||||||
|  | 
 | ||||||
|  | if (Guile_CONFIG_EXECUTABLE) | ||||||
|  |   execute_process (COMMAND ${Guile_CONFIG_EXECUTABLE} info prefix | ||||||
|  |     OUTPUT_VARIABLE Guile_ROOT_DIR | ||||||
|  |     OUTPUT_STRIP_TRAILING_WHITESPACE) | ||||||
|  | 
 | ||||||
|  |   execute_process (COMMAND ${Guile_CONFIG_EXECUTABLE} info sitedir | ||||||
|  |     OUTPUT_VARIABLE Guile_SITE_DIR | ||||||
|  |     OUTPUT_STRIP_TRAILING_WHITESPACE) | ||||||
|  | 
 | ||||||
|  |   execute_process (COMMAND ${Guile_CONFIG_EXECUTABLE} info extensiondir | ||||||
|  |     OUTPUT_VARIABLE Guile_EXTENSION_DIR | ||||||
|  |     OUTPUT_STRIP_TRAILING_WHITESPACE) | ||||||
|  | endif () | ||||||
|  | 
 | ||||||
|  | mark_as_advanced (Guile_EXECUTABLE | ||||||
|  |   Guile_INCLUDE_DIR | ||||||
|  |   Guile_LIBRARY | ||||||
|  |   Guile_LIBRARY_RELEASE | ||||||
|  |   Guile_GC_INCLUDE_DIR | ||||||
|  |   Guile_GC_LIBRARY | ||||||
|  |   Guile_GC_LIBRARY_RELEASE) | ||||||
							
								
								
									
										15
									
								
								third_party/immer/cmake/FindRRB.cmake
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								third_party/immer/cmake/FindRRB.cmake
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,15 @@ | ||||||
|  | # - Try to find c-rrb | ||||||
|  | # Once done, this will define | ||||||
|  | # | ||||||
|  | #  RRB_FOUND - system has RRB | ||||||
|  | #  RRB_INCLUDE_DIR - the RRB include directories | ||||||
|  | #  RRB_LIBRARIES - link these to use RRB | ||||||
|  | 
 | ||||||
|  | find_path(RRB_INCLUDE_DIR rrb.h) | ||||||
|  | find_library(RRB_LIBRARIES NAMES rrb librrb) | ||||||
|  | 
 | ||||||
|  | include(FindPackageHandleStandardArgs) | ||||||
|  | find_package_handle_standard_args( | ||||||
|  |   RRB DEFAULT_MSG RRB_LIBRARIES RRB_INCLUDE_DIR) | ||||||
|  | 
 | ||||||
|  | mark_as_advanced(RRB_INCLUDE_DIR RRB_LIBRARIES) | ||||||
							
								
								
									
										24
									
								
								third_party/immer/cmake/ImmerUtils.cmake
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								third_party/immer/cmake/ImmerUtils.cmake
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,24 @@ | ||||||
|  | 
 | ||||||
|  | function(immer_target_name_for out_target out_file file) | ||||||
|  |   get_filename_component(_extension ${_file} EXT) | ||||||
|  | 
 | ||||||
|  |   file(RELATIVE_PATH _relative ${PROJECT_SOURCE_DIR} ${file}) | ||||||
|  |   string(REPLACE "${_extension}" "" _name ${_relative}) | ||||||
|  |   string(REGEX REPLACE "/" "-" _name ${_name}) | ||||||
|  |   set(${out_target} "${_name}" PARENT_SCOPE) | ||||||
|  | 
 | ||||||
|  |   file(RELATIVE_PATH _relative ${CMAKE_CURRENT_LIST_DIR} ${file}) | ||||||
|  |   string(REPLACE "${_extension}" "" _name ${_relative}) | ||||||
|  |   string(REGEX REPLACE "/" "-" _name ${_name}) | ||||||
|  |   set(${out_file} "${_name}" PARENT_SCOPE) | ||||||
|  | endfunction() | ||||||
|  | 
 | ||||||
|  | function(immer_canonicalize_cmake_booleans) | ||||||
|  |   foreach(var ${ARGN}) | ||||||
|  |     if(${var}) | ||||||
|  |       set(${var} 1 PARENT_SCOPE) | ||||||
|  |     else() | ||||||
|  |       set(${var} 0 PARENT_SCOPE) | ||||||
|  |     endif() | ||||||
|  |   endforeach() | ||||||
|  | endfunction() | ||||||
							
								
								
									
										2
									
								
								third_party/immer/codecov.yml
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								third_party/immer/codecov.yml
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,2 @@ | ||||||
|  | ignore: | ||||||
|  |   - tools | ||||||
							
								
								
									
										14
									
								
								third_party/immer/default.nix
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								third_party/immer/default.nix
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,14 @@ | ||||||
|  | with import <nixpkgs> {}; | ||||||
|  | 
 | ||||||
|  | stdenv.mkDerivation rec { | ||||||
|  |   name = "immer-git"; | ||||||
|  |   version = "git"; | ||||||
|  |   src = fetchGit ./.; | ||||||
|  |   nativeBuildInputs = [ cmake ]; | ||||||
|  |   dontBuild = true; | ||||||
|  |   meta = with stdenv.lib; { | ||||||
|  |     homepage    = "https://github.com/arximboldi/immer"; | ||||||
|  |     description = "Postmodern immutable data structures for C++"; | ||||||
|  |     license     = licenses.boost; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										23
									
								
								third_party/immer/doc/CMakeLists.txt
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								third_party/immer/doc/CMakeLists.txt
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,23 @@ | ||||||
|  | 
 | ||||||
|  | #  Targets | ||||||
|  | #  ======= | ||||||
|  | 
 | ||||||
|  | add_custom_target(doxygen | ||||||
|  |   COMMAND doxygen doxygen.config | ||||||
|  |   WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/doc") | ||||||
|  | 
 | ||||||
|  | add_custom_target(docs | ||||||
|  |   COMMAND make html | ||||||
|  |   WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/doc") | ||||||
|  | add_dependencies(docs doxygen) | ||||||
|  | 
 | ||||||
|  | set(immer_ssh_method | ||||||
|  |   ssh -p 5488 | ||||||
|  |       -o StrictHostKeyChecking=no | ||||||
|  |       -i ${CMAKE_SOURCE_DIR}/tools/travis/ssh-key) | ||||||
|  | 
 | ||||||
|  | add_custom_target(upload-docs | ||||||
|  |   COMMAND | ||||||
|  |   rsync -av -e \"${immer_ssh_method}\" | ||||||
|  |         ${CMAKE_SOURCE_DIR}/doc/_build/html/* | ||||||
|  |         raskolnikov@sinusoid.es:public/immer/) | ||||||
							
								
								
									
										226
									
								
								third_party/immer/doc/Makefile
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										226
									
								
								third_party/immer/doc/Makefile
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,226 @@ | ||||||
|  | # Makefile for Sphinx documentation
 | ||||||
|  | #
 | ||||||
|  | 
 | ||||||
|  | # You can set these variables from the command line.
 | ||||||
|  | SPHINXOPTS    = | ||||||
|  | SPHINXBUILD   = sphinx-build | ||||||
|  | PAPER         = | ||||||
|  | BUILDDIR      = _build | ||||||
|  | 
 | ||||||
|  | # Internal variables.
 | ||||||
|  | PAPEROPT_a4     = -D latex_paper_size=a4 | ||||||
|  | PAPEROPT_letter = -D latex_paper_size=letter | ||||||
|  | ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . | ||||||
|  | # the i18n builder cannot share the environment and doctrees with the others
 | ||||||
|  | I18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . | ||||||
|  | 
 | ||||||
|  | .PHONY: help | ||||||
|  | help: | ||||||
|  | 	@echo "Please use \`make <target>' where <target> is one of" | ||||||
|  | 	@echo "  html       to make standalone HTML files" | ||||||
|  | 	@echo "  dirhtml    to make HTML files named index.html in directories" | ||||||
|  | 	@echo "  singlehtml to make a single large HTML file" | ||||||
|  | 	@echo "  pickle     to make pickle files" | ||||||
|  | 	@echo "  json       to make JSON files" | ||||||
|  | 	@echo "  htmlhelp   to make HTML files and a HTML help project" | ||||||
|  | 	@echo "  qthelp     to make HTML files and a qthelp project" | ||||||
|  | 	@echo "  applehelp  to make an Apple Help Book" | ||||||
|  | 	@echo "  devhelp    to make HTML files and a Devhelp project" | ||||||
|  | 	@echo "  epub       to make an epub" | ||||||
|  | 	@echo "  epub3      to make an epub3" | ||||||
|  | 	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter" | ||||||
|  | 	@echo "  latexpdf   to make LaTeX files and run them through pdflatex" | ||||||
|  | 	@echo "  latexpdfja to make LaTeX files and run them through platex/dvipdfmx" | ||||||
|  | 	@echo "  text       to make text files" | ||||||
|  | 	@echo "  man        to make manual pages" | ||||||
|  | 	@echo "  texinfo    to make Texinfo files" | ||||||
|  | 	@echo "  info       to make Texinfo files and run them through makeinfo" | ||||||
|  | 	@echo "  gettext    to make PO message catalogs" | ||||||
|  | 	@echo "  changes    to make an overview of all changed/added/deprecated items" | ||||||
|  | 	@echo "  xml        to make Docutils-native XML files" | ||||||
|  | 	@echo "  pseudoxml  to make pseudoxml-XML files for display purposes" | ||||||
|  | 	@echo "  linkcheck  to check all external links for integrity" | ||||||
|  | 	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)" | ||||||
|  | 	@echo "  coverage   to run coverage check of the documentation (if enabled)" | ||||||
|  | 	@echo "  dummy      to check syntax errors of document sources" | ||||||
|  | 
 | ||||||
|  | .PHONY: clean | ||||||
|  | clean: | ||||||
|  | 	rm -rf $(BUILDDIR)/* | ||||||
|  | 
 | ||||||
|  | .PHONY: html | ||||||
|  | html: | ||||||
|  | 	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html | ||||||
|  | 	bash sphinx-html-hack.bash | ||||||
|  | 	@echo | ||||||
|  | 	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html." | ||||||
|  | 
 | ||||||
|  | .PHONY: dirhtml | ||||||
|  | dirhtml: | ||||||
|  | 	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml | ||||||
|  | 	@echo | ||||||
|  | 	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." | ||||||
|  | 
 | ||||||
|  | .PHONY: singlehtml | ||||||
|  | singlehtml: | ||||||
|  | 	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml | ||||||
|  | 	@echo | ||||||
|  | 	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." | ||||||
|  | 
 | ||||||
|  | .PHONY: pickle | ||||||
|  | pickle: | ||||||
|  | 	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle | ||||||
|  | 	@echo | ||||||
|  | 	@echo "Build finished; now you can process the pickle files." | ||||||
|  | 
 | ||||||
|  | .PHONY: json | ||||||
|  | json: | ||||||
|  | 	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json | ||||||
|  | 	@echo | ||||||
|  | 	@echo "Build finished; now you can process the JSON files." | ||||||
|  | 
 | ||||||
|  | .PHONY: htmlhelp | ||||||
|  | htmlhelp: | ||||||
|  | 	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp | ||||||
|  | 	@echo | ||||||
|  | 	@echo "Build finished; now you can run HTML Help Workshop with the" \
 | ||||||
|  | 	      ".hhp project file in $(BUILDDIR)/htmlhelp." | ||||||
|  | 
 | ||||||
|  | .PHONY: qthelp | ||||||
|  | qthelp: | ||||||
|  | 	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp | ||||||
|  | 	@echo | ||||||
|  | 	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
 | ||||||
|  | 	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:" | ||||||
|  | 	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/immer.qhcp" | ||||||
|  | 	@echo "To view the help file:" | ||||||
|  | 	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/immer.qhc" | ||||||
|  | 
 | ||||||
|  | .PHONY: applehelp | ||||||
|  | applehelp: | ||||||
|  | 	$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp | ||||||
|  | 	@echo | ||||||
|  | 	@echo "Build finished. The help book is in $(BUILDDIR)/applehelp." | ||||||
|  | 	@echo "N.B. You won't be able to view it unless you put it in" \
 | ||||||
|  | 	      "~/Library/Documentation/Help or install it in your application" \
 | ||||||
|  | 	      "bundle." | ||||||
|  | 
 | ||||||
|  | .PHONY: devhelp | ||||||
|  | devhelp: | ||||||
|  | 	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp | ||||||
|  | 	@echo | ||||||
|  | 	@echo "Build finished." | ||||||
|  | 	@echo "To view the help file:" | ||||||
|  | 	@echo "# mkdir -p $$HOME/.local/share/devhelp/immer" | ||||||
|  | 	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/immer" | ||||||
|  | 	@echo "# devhelp" | ||||||
|  | 
 | ||||||
|  | .PHONY: epub | ||||||
|  | epub: | ||||||
|  | 	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub | ||||||
|  | 	@echo | ||||||
|  | 	@echo "Build finished. The epub file is in $(BUILDDIR)/epub." | ||||||
|  | 
 | ||||||
|  | .PHONY: epub3 | ||||||
|  | epub3: | ||||||
|  | 	$(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3 | ||||||
|  | 	@echo | ||||||
|  | 	@echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3." | ||||||
|  | 
 | ||||||
|  | .PHONY: latex | ||||||
|  | latex: | ||||||
|  | 	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex | ||||||
|  | 	@echo | ||||||
|  | 	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." | ||||||
|  | 	@echo "Run \`make' in that directory to run these through (pdf)latex" \
 | ||||||
|  | 	      "(use \`make latexpdf' here to do that automatically)." | ||||||
|  | 
 | ||||||
|  | .PHONY: latexpdf | ||||||
|  | latexpdf: | ||||||
|  | 	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex | ||||||
|  | 	@echo "Running LaTeX files through pdflatex..." | ||||||
|  | 	$(MAKE) -C $(BUILDDIR)/latex all-pdf | ||||||
|  | 	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." | ||||||
|  | 
 | ||||||
|  | .PHONY: latexpdfja | ||||||
|  | latexpdfja: | ||||||
|  | 	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex | ||||||
|  | 	@echo "Running LaTeX files through platex and dvipdfmx..." | ||||||
|  | 	$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja | ||||||
|  | 	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." | ||||||
|  | 
 | ||||||
|  | .PHONY: text | ||||||
|  | text: | ||||||
|  | 	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text | ||||||
|  | 	@echo | ||||||
|  | 	@echo "Build finished. The text files are in $(BUILDDIR)/text." | ||||||
|  | 
 | ||||||
|  | .PHONY: man | ||||||
|  | man: | ||||||
|  | 	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man | ||||||
|  | 	@echo | ||||||
|  | 	@echo "Build finished. The manual pages are in $(BUILDDIR)/man." | ||||||
|  | 
 | ||||||
|  | .PHONY: texinfo | ||||||
|  | texinfo: | ||||||
|  | 	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo | ||||||
|  | 	@echo | ||||||
|  | 	@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." | ||||||
|  | 	@echo "Run \`make' in that directory to run these through makeinfo" \
 | ||||||
|  | 	      "(use \`make info' here to do that automatically)." | ||||||
|  | 
 | ||||||
|  | .PHONY: info | ||||||
|  | info: | ||||||
|  | 	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo | ||||||
|  | 	@echo "Running Texinfo files through makeinfo..." | ||||||
|  | 	make -C $(BUILDDIR)/texinfo info | ||||||
|  | 	@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." | ||||||
|  | 
 | ||||||
|  | .PHONY: gettext | ||||||
|  | gettext: | ||||||
|  | 	$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale | ||||||
|  | 	@echo | ||||||
|  | 	@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." | ||||||
|  | 
 | ||||||
|  | .PHONY: changes | ||||||
|  | changes: | ||||||
|  | 	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes | ||||||
|  | 	@echo | ||||||
|  | 	@echo "The overview file is in $(BUILDDIR)/changes." | ||||||
|  | 
 | ||||||
|  | .PHONY: linkcheck | ||||||
|  | linkcheck: | ||||||
|  | 	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck | ||||||
|  | 	@echo | ||||||
|  | 	@echo "Link check complete; look for any errors in the above output " \
 | ||||||
|  | 	      "or in $(BUILDDIR)/linkcheck/output.txt." | ||||||
|  | 
 | ||||||
|  | .PHONY: doctest | ||||||
|  | doctest: | ||||||
|  | 	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest | ||||||
|  | 	@echo "Testing of doctests in the sources finished, look at the " \
 | ||||||
|  | 	      "results in $(BUILDDIR)/doctest/output.txt." | ||||||
|  | 
 | ||||||
|  | .PHONY: coverage | ||||||
|  | coverage: | ||||||
|  | 	$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage | ||||||
|  | 	@echo "Testing of coverage in the sources finished, look at the " \
 | ||||||
|  | 	      "results in $(BUILDDIR)/coverage/python.txt." | ||||||
|  | 
 | ||||||
|  | .PHONY: xml | ||||||
|  | xml: | ||||||
|  | 	$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml | ||||||
|  | 	@echo | ||||||
|  | 	@echo "Build finished. The XML files are in $(BUILDDIR)/xml." | ||||||
|  | 
 | ||||||
|  | .PHONY: pseudoxml | ||||||
|  | pseudoxml: | ||||||
|  | 	$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml | ||||||
|  | 	@echo | ||||||
|  | 	@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." | ||||||
|  | 
 | ||||||
|  | .PHONY: dummy | ||||||
|  | dummy: | ||||||
|  | 	$(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy | ||||||
|  | 	@echo | ||||||
|  | 	@echo "Build finished. Dummy builder generates no files." | ||||||
							
								
								
									
										100
									
								
								third_party/immer/doc/_static/logo-black.svg
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								third_party/immer/doc/_static/logo-black.svg
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,100 @@ | ||||||
|  | <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||||
|  | <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||||
|  | 
 | ||||||
|  | <svg | ||||||
|  |    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||||
|  |    xmlns:cc="http://creativecommons.org/ns#" | ||||||
|  |    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||||
|  |    xmlns:svg="http://www.w3.org/2000/svg" | ||||||
|  |    xmlns="http://www.w3.org/2000/svg" | ||||||
|  |    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||||
|  |    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||||
|  |    width="437.76035" | ||||||
|  |    height="141.89464" | ||||||
|  |    viewBox="0 0 115.8241 37.542956" | ||||||
|  |    version="1.1" | ||||||
|  |    id="svg5447" | ||||||
|  |    inkscape:version="0.92.1 r15371" | ||||||
|  |    sodipodi:docname="logo-black.svg"> | ||||||
|  |   <defs | ||||||
|  |      id="defs5441" /> | ||||||
|  |   <sodipodi:namedview | ||||||
|  |      id="base" | ||||||
|  |      pagecolor="#000000" | ||||||
|  |      bordercolor="#8b8384" | ||||||
|  |      borderopacity="1" | ||||||
|  |      inkscape:pageopacity="0" | ||||||
|  |      inkscape:pageshadow="2" | ||||||
|  |      inkscape:zoom="0.35" | ||||||
|  |      inkscape:cx="335.15011" | ||||||
|  |      inkscape:cy="98.353481" | ||||||
|  |      inkscape:document-units="mm" | ||||||
|  |      inkscape:current-layer="g4502" | ||||||
|  |      showgrid="false" | ||||||
|  |      fit-margin-top="0" | ||||||
|  |      fit-margin-left="0" | ||||||
|  |      fit-margin-right="0" | ||||||
|  |      fit-margin-bottom="0" | ||||||
|  |      inkscape:window-width="1152" | ||||||
|  |      inkscape:window-height="1080" | ||||||
|  |      inkscape:window-x="1920" | ||||||
|  |      inkscape:window-y="0" | ||||||
|  |      inkscape:window-maximized="0" | ||||||
|  |      units="px" /> | ||||||
|  |   <metadata | ||||||
|  |      id="metadata5444"> | ||||||
|  |     <rdf:RDF> | ||||||
|  |       <cc:Work | ||||||
|  |          rdf:about=""> | ||||||
|  |         <dc:format>image/svg+xml</dc:format> | ||||||
|  |         <dc:type | ||||||
|  |            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||||
|  |         <dc:title></dc:title> | ||||||
|  |       </cc:Work> | ||||||
|  |     </rdf:RDF> | ||||||
|  |   </metadata> | ||||||
|  |   <g | ||||||
|  |      inkscape:label="Layer 1" | ||||||
|  |      inkscape:groupmode="layer" | ||||||
|  |      id="layer1" | ||||||
|  |      transform="translate(6.8182189,-70.341619)"> | ||||||
|  |     <g | ||||||
|  |        id="g4502" | ||||||
|  |        transform="matrix(0.45286986,0,0,0.45286986,18.570763,48.756461)"> | ||||||
|  |       <g | ||||||
|  |          id="g5321" | ||||||
|  |          transform="matrix(0.28222223,0,0,0.28222223,263.62161,572.00923)" | ||||||
|  |          style="fill:none;stroke:#ffffff"> | ||||||
|  |         <g | ||||||
|  |            style="fill:none;stroke:#ffffff;stroke-width:20;stroke-miterlimit:4;stroke-dasharray:none" | ||||||
|  |            transform="translate(303.46093,-4.9296877)" | ||||||
|  |            id="g5317"> | ||||||
|  |           <path | ||||||
|  |              id="rect5315" | ||||||
|  |              style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:20;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||||||
|  |              d="m -1334.1996,-1796.9898 h 179.7406 v 179.7405 h -179.7406 z m -92,0 h 179.7406 v 179.7405 h -179.7406 z m 46,48 h 179.7406 v 179.7405 h -179.7406 z m 0,-94 h 179.7406 v 179.7405 h -179.7406 z m 0,48 h 179.7406 v 179.7405 h -179.7406 z" | ||||||
|  |              inkscape:connector-curvature="0" /> | ||||||
|  |         </g> | ||||||
|  |       </g> | ||||||
|  |       <text | ||||||
|  |          xml:space="preserve" | ||||||
|  |          style="font-style:normal;font-variant:normal;font-weight:900;font-stretch:normal;font-size:3.62277412px;line-height:0%;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Heavy';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.30189785px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||||
|  |          x="43.067963" | ||||||
|  |          y="112.13454" | ||||||
|  |          id="text5338"><tspan | ||||||
|  |            sodipodi:role="line" | ||||||
|  |            id="tspan5336" | ||||||
|  |            x="43.067963" | ||||||
|  |            y="112.13454" | ||||||
|  |            style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:53.88218689px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Bold';fill:#ffffff;stroke-width:0.30189785px">immer</tspan></text> | ||||||
|  |       <rect | ||||||
|  |          ry="0" | ||||||
|  |          y="66.38237" | ||||||
|  |          x="-37.756119" | ||||||
|  |          height="7.9375" | ||||||
|  |          width="7.9375" | ||||||
|  |          id="rect5425" | ||||||
|  |          style="opacity:1;vector-effect:none;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:3.35253906;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> | ||||||
|  |     </g> | ||||||
|  |   </g> | ||||||
|  | </svg> | ||||||
| After Width: | Height: | Size: 3.9 KiB | 
							
								
								
									
										99
									
								
								third_party/immer/doc/_static/logo-front.svg
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								third_party/immer/doc/_static/logo-front.svg
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,99 @@ | ||||||
|  | <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||||
|  | <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||||
|  | 
 | ||||||
|  | <svg | ||||||
|  |    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||||
|  |    xmlns:cc="http://creativecommons.org/ns#" | ||||||
|  |    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||||
|  |    xmlns:svg="http://www.w3.org/2000/svg" | ||||||
|  |    xmlns="http://www.w3.org/2000/svg" | ||||||
|  |    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||||
|  |    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||||
|  |    width="1037.7604" | ||||||
|  |    height="441.89462" | ||||||
|  |    viewBox="0 0 274.57411 116.91795" | ||||||
|  |    version="1.1" | ||||||
|  |    id="svg5447" | ||||||
|  |    inkscape:version="0.92.1 r15371" | ||||||
|  |    sodipodi:docname="logo-front.svg"> | ||||||
|  |   <defs | ||||||
|  |      id="defs5441" /> | ||||||
|  |   <sodipodi:namedview | ||||||
|  |      id="base" | ||||||
|  |      pagecolor="#ffffff" | ||||||
|  |      bordercolor="#666666" | ||||||
|  |      borderopacity="1.0" | ||||||
|  |      inkscape:pageopacity="0.0" | ||||||
|  |      inkscape:pageshadow="2" | ||||||
|  |      inkscape:zoom="0.35" | ||||||
|  |      inkscape:cx="172.29297" | ||||||
|  |      inkscape:cy="385.49612" | ||||||
|  |      inkscape:document-units="mm" | ||||||
|  |      inkscape:current-layer="layer1" | ||||||
|  |      showgrid="false" | ||||||
|  |      fit-margin-top="150" | ||||||
|  |      fit-margin-left="300" | ||||||
|  |      fit-margin-right="300" | ||||||
|  |      fit-margin-bottom="150" | ||||||
|  |      inkscape:window-width="1440" | ||||||
|  |      inkscape:window-height="1080" | ||||||
|  |      inkscape:window-x="1920" | ||||||
|  |      inkscape:window-y="0" | ||||||
|  |      inkscape:window-maximized="0" | ||||||
|  |      units="px" /> | ||||||
|  |   <metadata | ||||||
|  |      id="metadata5444"> | ||||||
|  |     <rdf:RDF> | ||||||
|  |       <cc:Work | ||||||
|  |          rdf:about=""> | ||||||
|  |         <dc:format>image/svg+xml</dc:format> | ||||||
|  |         <dc:type | ||||||
|  |            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||||
|  |         <dc:title></dc:title> | ||||||
|  |       </cc:Work> | ||||||
|  |     </rdf:RDF> | ||||||
|  |   </metadata> | ||||||
|  |   <g | ||||||
|  |      inkscape:label="Layer 1" | ||||||
|  |      inkscape:groupmode="layer" | ||||||
|  |      id="layer1" | ||||||
|  |      transform="translate(86.193219,-30.654119)"> | ||||||
|  |     <g | ||||||
|  |        id="g4502" | ||||||
|  |        transform="matrix(0.45286986,0,0,0.45286986,18.570763,48.756461)"> | ||||||
|  |       <g | ||||||
|  |          id="g5321" | ||||||
|  |          transform="matrix(0.28222223,0,0,0.28222223,263.62161,572.00923)"> | ||||||
|  |         <g | ||||||
|  |            style="stroke-width:20;stroke-miterlimit:4;stroke-dasharray:none" | ||||||
|  |            transform="translate(303.46093,-4.9296877)" | ||||||
|  |            id="g5317"> | ||||||
|  |           <path | ||||||
|  |              id="rect5315" | ||||||
|  |              style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:20;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||||||
|  |              d="m -1334.1996,-1796.9898 h 179.7406 v 179.7405 h -179.7406 z m -92,0 h 179.7406 v 179.7405 h -179.7406 z m 46,48 h 179.7406 v 179.7405 h -179.7406 z m 0,-94 h 179.7406 v 179.7405 h -179.7406 z m 0,48 h 179.7406 v 179.7405 h -179.7406 z" | ||||||
|  |              inkscape:connector-curvature="0" /> | ||||||
|  |         </g> | ||||||
|  |       </g> | ||||||
|  |       <text | ||||||
|  |          xml:space="preserve" | ||||||
|  |          style="font-style:normal;font-variant:normal;font-weight:900;font-stretch:normal;font-size:3.62277412px;line-height:0%;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Heavy';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.30189785px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||||
|  |          x="43.067963" | ||||||
|  |          y="112.13454" | ||||||
|  |          id="text5338"><tspan | ||||||
|  |            sodipodi:role="line" | ||||||
|  |            id="tspan5336" | ||||||
|  |            x="43.067963" | ||||||
|  |            y="112.13454" | ||||||
|  |            style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:53.88218689px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Bold';stroke-width:0.30189785px">immer</tspan></text> | ||||||
|  |       <rect | ||||||
|  |          ry="0" | ||||||
|  |          y="66.38237" | ||||||
|  |          x="-37.756119" | ||||||
|  |          height="7.9375" | ||||||
|  |          width="7.9375" | ||||||
|  |          id="rect5425" | ||||||
|  |          style="opacity:1;vector-effect:none;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:3.35253906;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> | ||||||
|  |     </g> | ||||||
|  |   </g> | ||||||
|  | </svg> | ||||||
| After Width: | Height: | Size: 3.8 KiB | 
							
								
								
									
										99
									
								
								third_party/immer/doc/_static/logo.svg
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								third_party/immer/doc/_static/logo.svg
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,99 @@ | ||||||
|  | <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||||
|  | <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||||
|  | 
 | ||||||
|  | <svg | ||||||
|  |    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||||
|  |    xmlns:cc="http://creativecommons.org/ns#" | ||||||
|  |    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||||
|  |    xmlns:svg="http://www.w3.org/2000/svg" | ||||||
|  |    xmlns="http://www.w3.org/2000/svg" | ||||||
|  |    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||||
|  |    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||||
|  |    width="437.76035" | ||||||
|  |    height="141.89464" | ||||||
|  |    viewBox="0 0 115.8241 37.542956" | ||||||
|  |    version="1.1" | ||||||
|  |    id="svg5447" | ||||||
|  |    inkscape:version="0.92.1 r15371" | ||||||
|  |    sodipodi:docname="logo.svg"> | ||||||
|  |   <defs | ||||||
|  |      id="defs5441" /> | ||||||
|  |   <sodipodi:namedview | ||||||
|  |      id="base" | ||||||
|  |      pagecolor="#ffffff" | ||||||
|  |      bordercolor="#666666" | ||||||
|  |      borderopacity="1.0" | ||||||
|  |      inkscape:pageopacity="0.0" | ||||||
|  |      inkscape:pageshadow="2" | ||||||
|  |      inkscape:zoom="0.35" | ||||||
|  |      inkscape:cx="-127.70703" | ||||||
|  |      inkscape:cy="235.49612" | ||||||
|  |      inkscape:document-units="mm" | ||||||
|  |      inkscape:current-layer="layer1" | ||||||
|  |      showgrid="false" | ||||||
|  |      fit-margin-top="0" | ||||||
|  |      fit-margin-left="0" | ||||||
|  |      fit-margin-right="0" | ||||||
|  |      fit-margin-bottom="0" | ||||||
|  |      inkscape:window-width="1440" | ||||||
|  |      inkscape:window-height="1080" | ||||||
|  |      inkscape:window-x="1920" | ||||||
|  |      inkscape:window-y="0" | ||||||
|  |      inkscape:window-maximized="0" | ||||||
|  |      units="px" /> | ||||||
|  |   <metadata | ||||||
|  |      id="metadata5444"> | ||||||
|  |     <rdf:RDF> | ||||||
|  |       <cc:Work | ||||||
|  |          rdf:about=""> | ||||||
|  |         <dc:format>image/svg+xml</dc:format> | ||||||
|  |         <dc:type | ||||||
|  |            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||||
|  |         <dc:title></dc:title> | ||||||
|  |       </cc:Work> | ||||||
|  |     </rdf:RDF> | ||||||
|  |   </metadata> | ||||||
|  |   <g | ||||||
|  |      inkscape:label="Layer 1" | ||||||
|  |      inkscape:groupmode="layer" | ||||||
|  |      id="layer1" | ||||||
|  |      transform="translate(6.8182189,-70.341619)"> | ||||||
|  |     <g | ||||||
|  |        id="g4502" | ||||||
|  |        transform="matrix(0.45286986,0,0,0.45286986,18.570763,48.756461)"> | ||||||
|  |       <g | ||||||
|  |          id="g5321" | ||||||
|  |          transform="matrix(0.28222223,0,0,0.28222223,263.62161,572.00923)"> | ||||||
|  |         <g | ||||||
|  |            style="stroke-width:20;stroke-miterlimit:4;stroke-dasharray:none" | ||||||
|  |            transform="translate(303.46093,-4.9296877)" | ||||||
|  |            id="g5317"> | ||||||
|  |           <path | ||||||
|  |              id="rect5315" | ||||||
|  |              style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:20;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||||||
|  |              d="m -1334.1996,-1796.9898 h 179.7406 v 179.7405 h -179.7406 z m -92,0 h 179.7406 v 179.7405 h -179.7406 z m 46,48 h 179.7406 v 179.7405 h -179.7406 z m 0,-94 h 179.7406 v 179.7405 h -179.7406 z m 0,48 h 179.7406 v 179.7405 h -179.7406 z" | ||||||
|  |              inkscape:connector-curvature="0" /> | ||||||
|  |         </g> | ||||||
|  |       </g> | ||||||
|  |       <text | ||||||
|  |          xml:space="preserve" | ||||||
|  |          style="font-style:normal;font-variant:normal;font-weight:900;font-stretch:normal;font-size:3.62277412px;line-height:0%;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Heavy';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.30189785px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||||
|  |          x="43.067963" | ||||||
|  |          y="112.13454" | ||||||
|  |          id="text5338"><tspan | ||||||
|  |            sodipodi:role="line" | ||||||
|  |            id="tspan5336" | ||||||
|  |            x="43.067963" | ||||||
|  |            y="112.13454" | ||||||
|  |            style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:53.88218689px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Bold';stroke-width:0.30189785px">immer</tspan></text> | ||||||
|  |       <rect | ||||||
|  |          ry="0" | ||||||
|  |          y="66.38237" | ||||||
|  |          x="-37.756119" | ||||||
|  |          height="7.9375" | ||||||
|  |          width="7.9375" | ||||||
|  |          id="rect5425" | ||||||
|  |          style="opacity:1;vector-effect:none;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:3.35253906;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> | ||||||
|  |     </g> | ||||||
|  |   </g> | ||||||
|  | </svg> | ||||||
| After Width: | Height: | Size: 3.8 KiB | 
							
								
								
									
										120
									
								
								third_party/immer/doc/_static/patreon.svg
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								third_party/immer/doc/_static/patreon.svg
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,120 @@ | ||||||
|  | <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||||
|  | <!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  --> | ||||||
|  | 
 | ||||||
|  | <svg | ||||||
|  |    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||||
|  |    xmlns:cc="http://creativecommons.org/ns#" | ||||||
|  |    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||||
|  |    xmlns:svg="http://www.w3.org/2000/svg" | ||||||
|  |    xmlns="http://www.w3.org/2000/svg" | ||||||
|  |    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||||
|  |    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||||
|  |    version="1.1" | ||||||
|  |    id="Layer_1" | ||||||
|  |    x="0px" | ||||||
|  |    y="0px" | ||||||
|  |    viewBox="0 0 175.20599 88.309158" | ||||||
|  |    xml:space="preserve" | ||||||
|  |    sodipodi:docname="patreon.svg" | ||||||
|  |    inkscape:version="0.92.2pre0 (973e216, 2017-07-25)" | ||||||
|  |    width="175.20599" | ||||||
|  |    height="88.309158"><metadata | ||||||
|  |      id="metadata53"><rdf:RDF><cc:Work | ||||||
|  |          rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | ||||||
|  |            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title>support</dc:title></cc:Work></rdf:RDF></metadata><defs | ||||||
|  |      id="defs51" /><sodipodi:namedview | ||||||
|  |      pagecolor="#ffffff" | ||||||
|  |      bordercolor="#666666" | ||||||
|  |      borderopacity="1" | ||||||
|  |      objecttolerance="10" | ||||||
|  |      gridtolerance="10" | ||||||
|  |      guidetolerance="10" | ||||||
|  |      inkscape:pageopacity="0" | ||||||
|  |      inkscape:pageshadow="2" | ||||||
|  |      inkscape:window-width="1267" | ||||||
|  |      inkscape:window-height="1054" | ||||||
|  |      id="namedview49" | ||||||
|  |      showgrid="false" | ||||||
|  |      inkscape:zoom="1.672" | ||||||
|  |      inkscape:cx="-2.5899259" | ||||||
|  |      inkscape:cy="100.34184" | ||||||
|  |      inkscape:window-x="0" | ||||||
|  |      inkscape:window-y="26" | ||||||
|  |      inkscape:window-maximized="0" | ||||||
|  |      inkscape:current-layer="Layer_1" | ||||||
|  |      fit-margin-left="16" | ||||||
|  |      fit-margin-right="16" | ||||||
|  |      fit-margin-bottom="16" | ||||||
|  |      fit-margin-top="16" | ||||||
|  |      showborder="true" /><style | ||||||
|  |      type="text/css" | ||||||
|  |      id="style2"> | ||||||
|  | 	.st0{fill:#E64825;} | ||||||
|  | 	.st1{fill:#FFFFFF;} | ||||||
|  | 	.st2{enable-background:new    ;} | ||||||
|  | </style><title | ||||||
|  |      id="title4">support</title><g | ||||||
|  |      id="g4591" | ||||||
|  |      transform="matrix(1.1623322,0,0,1.1623322,4.376678,-18.86997)"><rect | ||||||
|  |        ry="5.3968496" | ||||||
|  |        y="30.000004" | ||||||
|  |        x="10" | ||||||
|  |        height="48.444977" | ||||||
|  |        width="123.20574" | ||||||
|  |        id="rect4576" | ||||||
|  |        style="opacity:1;vector-effect:none;fill:#f96854;fill-opacity:1;stroke:none;stroke-width:1.95915079;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /><g | ||||||
|  |        transform="translate(9.401915,29.145936)" | ||||||
|  |        id="g4574"><g | ||||||
|  |          id="g4557" | ||||||
|  |          transform="translate(-120.21531,7.9502949)"><path | ||||||
|  |            id="path8" | ||||||
|  |            d="m 143.8,12.9 h 0.7 c 6.4,0.2 11.5,5.6 11.3,12 -0.2,6.2 -5.1,11.1 -11.3,11.3 h -5.7 c 0,-3.9 0,-7.8 0,-11.7 0.1,-2.9 2.5,-5.3 5.4,-5.2 2.9,0.1 5.3,2.5 5.2,5.4 -0.1,2.9 -2.5,5.3 -5.4,5.2 -0.8,0 -1.7,-0.2 -2.4,-0.6 0,1.3 0,2.5 0,3.8 1.7,0.5 3.6,0.5 5.3,-0.1 4.7,-1.5 7.2,-6.6 5.6,-11.2 -1.5,-4.7 -6.6,-7.2 -11.2,-5.6 -3.6,1.2 -6,4.5 -6.1,8.3 0,3.9 0,7.8 0,11.7 h -2.8 v -12 c 0.1,-4 2.3,-7.6 5.6,-9.6 1.9,-1.1 3.8,-1.7 5.8,-1.7 z" | ||||||
|  |            class="st1" | ||||||
|  |            inkscape:connector-curvature="0" | ||||||
|  |            style="fill:#ffffff" /><path | ||||||
|  |            id="path10" | ||||||
|  |            d="m 186.5,13.9 h 1.9 c 0,1.4 0,2.9 0,4.3 h 2.8 c 0,0.6 0,1.3 0,1.9 h -2.8 c 0,3.1 0,6.2 0,9.3 h -1.9 c 0,-3.1 0,-6.2 0,-9.3 h -1.1 c 0,-0.6 0,-1.3 0,-1.9 h 1.1 c 0,-1.4 -0.1,-2.9 0,-4.3 z" | ||||||
|  |            class="st1" | ||||||
|  |            inkscape:connector-curvature="0" | ||||||
|  |            style="fill:#ffffff" /><path | ||||||
|  |            id="path12" | ||||||
|  |            d="m 177.5,17.8 c 3.3,-0.7 6.5,1.5 7.2,4.8 0,0.1 0,0.2 0,0.2 0.1,0.6 0.1,1.2 0.1,1.8 0,1.6 0,3.2 0,4.8 h -1.9 c 0,-0.4 0,-0.8 0,-1.2 -2.4,2.3 -6.3,2.2 -8.6,-0.2 -2.3,-2.4 -2.2,-6.3 0.2,-8.6 0.8,-0.9 1.9,-1.4 3,-1.6 z m 0.8,1.7 c -2.3,0.2 -4,2.3 -3.8,4.6 0,0.3 0.1,0.5 0.2,0.8 0.2,0.8 0.7,1.5 1.3,2 0.7,0.6 1.6,1 2.6,1 0.8,0 1.6,-0.1 2.3,-0.5 2,-1.2 2.7,-3.7 1.6,-5.8 -1,-1.4 -2.5,-2.2 -4.2,-2.1 z" | ||||||
|  |            class="st1" | ||||||
|  |            inkscape:connector-curvature="0" | ||||||
|  |            style="fill:#ffffff" /><path | ||||||
|  |            id="path14" | ||||||
|  |            d="m 203.3,17.7 c 2,-0.3 4,0.5 5.3,1.9 l -7.9,6.6 c 1.4,1.9 4,2.3 5.9,0.9 1.3,-0.9 1.9,-2.5 1.7,-4 h 1.9 c 0.1,1.3 -0.2,2.6 -0.9,3.8 -0.5,0.9 -1.2,1.6 -2.1,2.1 -2.9,1.7 -6.6,0.8 -8.4,-2.1 -0.7,-1.1 -1,-2.4 -0.9,-3.6 0.1,-1 0.4,-2 1,-2.8 1.1,-1.5 2.6,-2.5 4.4,-2.8 z m -2.8,3.8 c -0.6,0.9 -0.8,2 -0.6,3 l 5.6,-4.7 c -0.3,-0.1 -0.7,-0.2 -1,-0.2 -1.6,-0.2 -3.1,0.6 -4,1.9 z" | ||||||
|  |            class="st1" | ||||||
|  |            inkscape:connector-curvature="0" | ||||||
|  |            style="fill:#ffffff" /><path | ||||||
|  |            id="path16" | ||||||
|  |            d="m 216.6,17.7 c 1.3,-0.1 2.6,0.2 3.6,0.9 2.9,1.8 3.7,5.5 1.9,8.4 -1.8,2.9 -5.5,3.7 -8.4,1.9 -2.9,-1.8 -3.7,-5.5 -1.9,-8.4 0.5,-0.8 1.2,-1.5 2,-2 0.9,-0.5 1.8,-0.8 2.8,-0.8 z m 0.1,1.8 c -2.3,0.2 -4.1,2.2 -3.9,4.5 0.2,2.3 2.2,4.1 4.5,3.9 2.3,-0.2 4.1,-2.2 3.9,-4.5 -0.1,-1.2 -0.7,-2.4 -1.7,-3.1 -0.8,-0.6 -1.8,-0.8 -2.8,-0.8 z" | ||||||
|  |            class="st1" | ||||||
|  |            inkscape:connector-curvature="0" | ||||||
|  |            style="fill:#ffffff" /><path | ||||||
|  |            id="path18" | ||||||
|  |            d="m 226,18.9 c 1.2,-1.1 2.8,-1.5 4.3,-1.1 1.2,0.3 2.2,1 2.9,1.9 0.6,0.8 1,1.8 1,2.8 0,1.5 0,3 0,4.6 v 2.2 h -1.9 c 0,-2.2 0,-4.5 0,-6.7 0,-1.1 -0.6,-2.1 -1.5,-2.6 -0.8,-0.5 -1.8,-0.6 -2.7,-0.3 -1.1,0.4 -1.9,1.5 -2.1,2.7 0,0.5 0,1 0,1.6 0,1.8 0,3.6 0,5.4 h -1.9 c 0,-3.7 0,-7.4 0,-11.1 h 1.9 c 0,0.1 0,0.3 0,0.6 z" | ||||||
|  |            class="st1" | ||||||
|  |            inkscape:connector-curvature="0" | ||||||
|  |            style="fill:#ffffff" /><path | ||||||
|  |            id="path20" | ||||||
|  |            d="m 161.1,20 c 2.1,-2.6 5.9,-3.1 8.6,-1 2.6,2.1 3.1,5.9 1,8.6 -1.1,1.3 -2.6,2.2 -4.3,2.3 -1,0.1 -2,-0.1 -2.8,-0.6 -0.7,-0.3 -1.3,-0.8 -1.8,-1.3 0,1.9 0,3.8 0,5.7 h -1.9 c 0,-3.3 0,-6.6 0,-9.9 -0.1,-1.4 0.4,-2.7 1.2,-3.8 z m 4,-0.4 c -2.3,0.4 -3.8,2.6 -3.4,4.9 0.4,2.3 2.6,3.8 4.9,3.4 2.3,-0.4 3.8,-2.6 3.4,-4.9 -0.2,-1.2 -1,-2.3 -2,-2.9 -0.9,-0.5 -1.9,-0.7 -2.9,-0.5 z" | ||||||
|  |            class="st1" | ||||||
|  |            inkscape:connector-curvature="0" | ||||||
|  |            style="fill:#ffffff" /><path | ||||||
|  |            id="path22" | ||||||
|  |            d="m 192,18.2 h 1.8 c 0,0.6 0,1.1 0,1.7 1.2,-1.1 2.8,-1.8 4.4,-1.7 0,0.6 0,1.3 0,1.9 -2.3,-0.1 -4.3,1.7 -4.4,4.1 0,0 0,0.1 0,0.1 0,1.7 0,3.4 0,5.1 H 192 c 0.1,-3.8 0,-7.5 0,-11.2 z" | ||||||
|  |            class="st1" | ||||||
|  |            inkscape:connector-curvature="0" | ||||||
|  |            style="fill:#ffffff" /></g><text | ||||||
|  |          xml:space="preserve" | ||||||
|  |          style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.8520174px;line-height:4.5em;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.73991024" | ||||||
|  |          x="114.89897" | ||||||
|  |          y="14.870183" | ||||||
|  |          id="text4561"><tspan | ||||||
|  |            sodipodi:role="line" | ||||||
|  |            id="tspan4559" | ||||||
|  |            x="114.89897" | ||||||
|  |            y="14.870183" | ||||||
|  |            style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';fill:#ffffff;stroke-width:0.73991024">support us on</tspan></text> | ||||||
|  | </g></g></svg> | ||||||
| After Width: | Height: | Size: 6.9 KiB | 
							
								
								
									
										166
									
								
								third_party/immer/doc/_static/sinusoidal-badge.svg
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										166
									
								
								third_party/immer/doc/_static/sinusoidal-badge.svg
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,166 @@ | ||||||
|  | <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||||
|  | <svg | ||||||
|  |    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||||
|  |    xmlns:cc="http://creativecommons.org/ns#" | ||||||
|  |    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||||
|  |    xmlns:svg="http://www.w3.org/2000/svg" | ||||||
|  |    xmlns="http://www.w3.org/2000/svg" | ||||||
|  |    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||||
|  |    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||||
|  |    width="350" | ||||||
|  |    height="20" | ||||||
|  |    version="1.1" | ||||||
|  |    id="svg28" | ||||||
|  |    sodipodi:docname="sinusoidal-badge.svg" | ||||||
|  |    inkscape:version="0.92.2pre0 (973e216, 2017-07-25)"> | ||||||
|  |   <metadata | ||||||
|  |      id="metadata34"> | ||||||
|  |     <rdf:RDF> | ||||||
|  |       <cc:Work | ||||||
|  |          rdf:about=""> | ||||||
|  |         <dc:format>image/svg+xml</dc:format> | ||||||
|  |         <dc:type | ||||||
|  |            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||||
|  |         <dc:title></dc:title> | ||||||
|  |       </cc:Work> | ||||||
|  |     </rdf:RDF> | ||||||
|  |   </metadata> | ||||||
|  |   <defs | ||||||
|  |      id="defs32"> | ||||||
|  |     <marker | ||||||
|  |        inkscape:isstock="true" | ||||||
|  |        style="overflow:visible" | ||||||
|  |        id="Arrow1Lstart" | ||||||
|  |        refX="0" | ||||||
|  |        refY="0" | ||||||
|  |        orient="auto" | ||||||
|  |        inkscape:stockid="Arrow1Lstart"> | ||||||
|  |       <path | ||||||
|  |          inkscape:connector-curvature="0" | ||||||
|  |          transform="matrix(0.8,0,0,0.8,10,0)" | ||||||
|  |          style="fill:#444444;fill-opacity:1;fill-rule:evenodd;stroke:#444444;stroke-width:1.00000003pt;stroke-opacity:1" | ||||||
|  |          d="M 0,0 5,-5 -12.5,0 5,5 Z" | ||||||
|  |          id="path10186" /> | ||||||
|  |     </marker> | ||||||
|  |   </defs> | ||||||
|  |   <sodipodi:namedview | ||||||
|  |      pagecolor="#ffffff" | ||||||
|  |      bordercolor="#666666" | ||||||
|  |      borderopacity="1" | ||||||
|  |      objecttolerance="10" | ||||||
|  |      gridtolerance="10" | ||||||
|  |      guidetolerance="10" | ||||||
|  |      inkscape:pageopacity="0" | ||||||
|  |      inkscape:pageshadow="2" | ||||||
|  |      inkscape:window-width="1267" | ||||||
|  |      inkscape:window-height="1054" | ||||||
|  |      id="namedview30" | ||||||
|  |      showgrid="false" | ||||||
|  |      inkscape:zoom="1" | ||||||
|  |      inkscape:cx="89.411561" | ||||||
|  |      inkscape:cy="-177.54677" | ||||||
|  |      inkscape:window-x="0" | ||||||
|  |      inkscape:window-y="26" | ||||||
|  |      inkscape:window-maximized="0" | ||||||
|  |      inkscape:current-layer="g26" /> | ||||||
|  |   <linearGradient | ||||||
|  |      id="b" | ||||||
|  |      x2="0" | ||||||
|  |      y2="1"> | ||||||
|  |     <stop | ||||||
|  |        offset="0" | ||||||
|  |        stop-color="#bbb" | ||||||
|  |        stop-opacity=".1" | ||||||
|  |        id="stop2" /> | ||||||
|  |     <stop | ||||||
|  |        offset="1" | ||||||
|  |        stop-opacity=".1" | ||||||
|  |        id="stop4" /> | ||||||
|  |   </linearGradient> | ||||||
|  |   <mask | ||||||
|  |      id="a"> | ||||||
|  |     <rect | ||||||
|  |        width="96" | ||||||
|  |        height="20" | ||||||
|  |        rx="3" | ||||||
|  |        id="rect7" | ||||||
|  |        x="0" | ||||||
|  |        y="0" | ||||||
|  |        style="fill:#ffffff" /> | ||||||
|  |   </mask> | ||||||
|  |   <g | ||||||
|  |      font-size="11" | ||||||
|  |      id="g26" | ||||||
|  |      style="font-size:11px;font-family:'DejaVu Sans', Verdana, Geneva, sans-serif;text-anchor:middle;fill:#000000"> | ||||||
|  |     <text | ||||||
|  |        x="30" | ||||||
|  |        y="15" | ||||||
|  |        id="text18" | ||||||
|  |        style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';fill:#000000;fill-opacity:0.3" /> | ||||||
|  |     <text | ||||||
|  |        xml:space="preserve" | ||||||
|  |        style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:14.66666698px;line-height:4.5em;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro';text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none" | ||||||
|  |        x="52.626465" | ||||||
|  |        y="14.072" | ||||||
|  |        id="text843"><tspan | ||||||
|  |          sodipodi:role="line" | ||||||
|  |          id="tspan841" | ||||||
|  |          x="52.626465" | ||||||
|  |          y="14.072" | ||||||
|  |          style="font-size:13.33333397px"><tspan | ||||||
|  |            style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:13.33333397px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light'" | ||||||
|  |            id="tspan859">quality libre software by</tspan><tspan | ||||||
|  |            style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:13.33333397px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Bold'" | ||||||
|  |            id="tspan4711">  </tspan><tspan | ||||||
|  |            style="font-weight:bold;font-size:13.33333397px" | ||||||
|  |            id="tspan849">sinusoidal engineering</tspan></tspan></text> | ||||||
|  |     <g | ||||||
|  |        transform="matrix(4.4383113,0,0,4.4383113,-73.95876,-379.69787)" | ||||||
|  |        id="layer1" | ||||||
|  |        inkscape:label="Layer 1"> | ||||||
|  |       <g | ||||||
|  |          id="g10518" | ||||||
|  |          transform="matrix(0.07290361,0,0,0.07290361,90.22887,85.474692)"> | ||||||
|  |         <g | ||||||
|  |            id="g906" | ||||||
|  |            transform="matrix(0.8913912,0,0,0.8913912,6.4029255,3.518587)"> | ||||||
|  |           <g | ||||||
|  |              transform="translate(2.9886077,2.3730299)" | ||||||
|  |              style="stroke-width:6;stroke-miterlimit:4;stroke-dasharray:none" | ||||||
|  |              id="g10505"> | ||||||
|  |             <g | ||||||
|  |                transform="matrix(0.28222223,0,0,0.28222223,237.85811,-1729.1481)" | ||||||
|  |                style="stroke:#444444;stroke-width:32.14861298;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" | ||||||
|  |                id="g6292"> | ||||||
|  |               <rect | ||||||
|  |                  y="6129.2646" | ||||||
|  |                  x="-842.80432" | ||||||
|  |                  height="206.24994" | ||||||
|  |                  width="206.25005" | ||||||
|  |                  id="rect6290" | ||||||
|  |                  style="opacity:1;fill:none;fill-opacity:1;stroke:#444444;stroke-width:32.14861298;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> | ||||||
|  |             </g> | ||||||
|  |             <path | ||||||
|  |                id="path6294" | ||||||
|  |                title="sin(x/2)" | ||||||
|  |                d="m 55.5625,0.66666667 c -0.928371,0 -1.856705,0.13319437 -2.785079,0.39715343 -0.928371,0.2636873 -1.856744,0.6592201 -2.785077,1.1798418 -0.928372,0.5208916 -1.856743,1.1674139 -2.785116,1.9309205 -0.928334,0.7632369 -1.856705,1.6439988 -2.785078,2.6290465 -0.928372,0.9850477 -1.856743,2.0754629 -2.785077,3.2555751 -0.928372,1.180112 -1.856744,2.450461 -2.785115,3.793218 -0.928336,1.342755 -1.856706,2.758458 -2.785077,4.227385 -0.928374,1.469197 -1.856708,2.991617 -2.785079,4.546459 -0.928372,1.555111 -1.856744,3.142642 -2.785115,4.741252 -0.928334,1.598609 -1.856707,3.208295 -2.785078,4.806905 -0.928371,1.598608 -1.856705,3.18614 -2.785079,4.741251 -0.928371,1.555112 -1.856705,3.077263 -2.785077,4.546188 -0.928408,1.469197 -1.856743,2.88463 -2.785079,4.227655 -0.928407,1.342757 -1.856742,2.612837 -2.785115,3.793218 -0.928334,1.180113 -1.856705,2.270258 -2.785077,3.255575 -0.928372,0.985319 -1.856742,1.86554 -2.785113,2.629047 -0.928337,0.763506 -1.8567441,1.409758 -2.785079,1.93092 C 7.2876175,57.819171 6.3592466,58.214164 5.4308755,58.478121 4.5025393,58.742347 3.5742044,58.875 2.6458333,58.875" | ||||||
|  |                style="opacity:1;fill:none;fill-opacity:1;stroke:#444444;stroke-width:9.07305336;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||||||
|  |                inkscape:connector-curvature="0" /> | ||||||
|  |           </g> | ||||||
|  |           <circle | ||||||
|  |              r="7.2447839" | ||||||
|  |              cy="2.9294415" | ||||||
|  |              cx="61.518147" | ||||||
|  |              id="ellipse10510" | ||||||
|  |              style="opacity:1;fill:#f0544c;fill-opacity:1;stroke:#ffffff;stroke-width:5.44383192;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> | ||||||
|  |           <circle | ||||||
|  |              style="opacity:1;fill:#444444;fill-opacity:1;stroke:#ffffff;stroke-width:5.44383192;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||||||
|  |              id="circle898" | ||||||
|  |              cx="2.0896502" | ||||||
|  |              cy="61.450638" | ||||||
|  |              r="7.2447839" /> | ||||||
|  |         </g> | ||||||
|  |       </g> | ||||||
|  |     </g> | ||||||
|  |   </g> | ||||||
|  | </svg> | ||||||
| After Width: | Height: | Size: 7.1 KiB | 
							
								
								
									
										28
									
								
								third_party/immer/doc/algorithms.rst
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								third_party/immer/doc/algorithms.rst
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,28 @@ | ||||||
|  | 
 | ||||||
|  | Algorithms | ||||||
|  | ========== | ||||||
|  | 
 | ||||||
|  | This module provides overloads of standard algorithms that leverage | ||||||
|  | the internal structure of the immutable containers to provide faster | ||||||
|  | iteration. These are drop-in replacements of the respective STL | ||||||
|  | algorithms that can be a few times faster when applied on immutable | ||||||
|  | sequences. | ||||||
|  | 
 | ||||||
|  | For further convenience they can be passed in just a container where | ||||||
|  | the standard library algorithms require being passed in two iterators. | ||||||
|  | 
 | ||||||
|  | .. note:: | ||||||
|  | 
 | ||||||
|  |    They are a similar idea to `structure-aware iterators`_ | ||||||
|  |    but implemented using higher order functions in order to support | ||||||
|  |    structures of any depth.  The downside is that this sometimes | ||||||
|  |    causes the compiler to generate bigger executable files. | ||||||
|  | 
 | ||||||
|  | .. _structure-aware iterators: https://www.youtube.com/watch?v=T3oA3zAMH9M | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ----- | ||||||
|  | 
 | ||||||
|  | .. doxygengroup:: algorithm | ||||||
|  |    :project: immer | ||||||
|  |    :content-only: | ||||||
							
								
								
									
										452
									
								
								third_party/immer/doc/conf.py
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										452
									
								
								third_party/immer/doc/conf.py
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,452 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # | ||||||
|  | # immer documentation build configuration file, created by | ||||||
|  | # sphinx-quickstart on Thu Oct 27 18:10:24 2016. | ||||||
|  | # | ||||||
|  | # This file is execfile()d with the current directory set to its | ||||||
|  | # containing dir. | ||||||
|  | # | ||||||
|  | # Note that not all possible configuration values are present in this | ||||||
|  | # autogenerated file. | ||||||
|  | # | ||||||
|  | # All configuration values have a default; values that are commented out | ||||||
|  | # serve to show the default. | ||||||
|  | 
 | ||||||
|  | # If extensions (or modules to document with autodoc) are in another directory, | ||||||
|  | # add these directories to sys.path here. If the directory is relative to the | ||||||
|  | # documentation root, use os.path.abspath to make it absolute, like shown here. | ||||||
|  | # | ||||||
|  | # import os | ||||||
|  | # import sys | ||||||
|  | # sys.path.insert(0, os.path.abspath('.')) | ||||||
|  | 
 | ||||||
|  | # -- General configuration ------------------------------------------------ | ||||||
|  | 
 | ||||||
|  | # If your documentation needs a minimal Sphinx version, state it here. | ||||||
|  | # | ||||||
|  | # needs_sphinx = '1.0' | ||||||
|  | 
 | ||||||
|  | # Add any Sphinx extension module names here, as strings. They can be | ||||||
|  | # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom | ||||||
|  | # ones. | ||||||
|  | extensions = [ | ||||||
|  |     'sphinx.ext.mathjax', | ||||||
|  |     'breathe', | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | breathe_projects = { "immer": "_doxygen/xml" } | ||||||
|  | breathe_default_project = "immer" | ||||||
|  | 
 | ||||||
|  | # Add any paths that contain templates here, relative to this directory. | ||||||
|  | templates_path = ['_templates'] | ||||||
|  | 
 | ||||||
|  | # The suffix(es) of source filenames. | ||||||
|  | # You can specify multiple suffix as a list of string: | ||||||
|  | # | ||||||
|  | from recommonmark.parser import CommonMarkParser | ||||||
|  | from recommonmark.transform import AutoStructify | ||||||
|  | source_parsers = { '.md': CommonMarkParser, } | ||||||
|  | source_suffix = ['.rst', '.md'] | ||||||
|  | 
 | ||||||
|  | def setup(app): | ||||||
|  |     app.add_config_value('recommonmark_config', { | ||||||
|  |         'enable_eval_rst': True, | ||||||
|  |     }, True) | ||||||
|  |     app.add_transform(AutoStructify) | ||||||
|  | 
 | ||||||
|  | # The encoding of source files. | ||||||
|  | # | ||||||
|  | # source_encoding = 'utf-8-sig' | ||||||
|  | 
 | ||||||
|  | # The master toctree document. | ||||||
|  | master_doc = 'index' | ||||||
|  | 
 | ||||||
|  | # General information about the project. | ||||||
|  | project = u'immer' | ||||||
|  | copyright = u'2016, 2017 Juan Pedro Bolivar Puente' | ||||||
|  | author = u'Juan Pedro Bolivar Puente' | ||||||
|  | 
 | ||||||
|  | raw_enabled = True | ||||||
|  | 
 | ||||||
|  | # The version info for the project you're documenting, acts as replacement for | ||||||
|  | # |version| and |release|, also used in various other places throughout the | ||||||
|  | # built documents. | ||||||
|  | # | ||||||
|  | # The short X.Y version. | ||||||
|  | version = u'0.0.0' | ||||||
|  | # The full version, including alpha/beta/rc tags. | ||||||
|  | release = u'0.0.0' | ||||||
|  | 
 | ||||||
|  | # The language for content autogenerated by Sphinx. Refer to documentation | ||||||
|  | # for a list of supported languages. | ||||||
|  | # | ||||||
|  | # This is also used if you do content translation via gettext catalogs. | ||||||
|  | # Usually you set "language" from the command line for these cases. | ||||||
|  | language = None | ||||||
|  | 
 | ||||||
|  | # There are two options for replacing |today|: either, you set today to some | ||||||
|  | # non-false value, then it is used: | ||||||
|  | # | ||||||
|  | # today = '' | ||||||
|  | # | ||||||
|  | # Else, today_fmt is used as the format for a strftime call. | ||||||
|  | # | ||||||
|  | # today_fmt = '%B %d, %Y' | ||||||
|  | 
 | ||||||
|  | # List of patterns, relative to source directory, that match files and | ||||||
|  | # directories to ignore when looking for source files. | ||||||
|  | # This patterns also effect to html_static_path and html_extra_path | ||||||
|  | exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] | ||||||
|  | 
 | ||||||
|  | # The reST default role (used for this markup: `text`) to use for all | ||||||
|  | # documents. | ||||||
|  | # | ||||||
|  | # default_role = None | ||||||
|  | 
 | ||||||
|  | # If true, '()' will be appended to :func: etc. cross-reference text. | ||||||
|  | # | ||||||
|  | # add_function_parentheses = True | ||||||
|  | 
 | ||||||
|  | # If true, the current module name will be prepended to all description | ||||||
|  | # unit titles (such as .. function::). | ||||||
|  | # | ||||||
|  | # add_module_names = True | ||||||
|  | 
 | ||||||
|  | # If true, sectionauthor and moduleauthor directives will be shown in the | ||||||
|  | # output. They are ignored by default. | ||||||
|  | # | ||||||
|  | # show_authors = False | ||||||
|  | 
 | ||||||
|  | # The name of the Pygments (syntax highlighting) style to use. | ||||||
|  | pygments_style = 'sphinx' | ||||||
|  | 
 | ||||||
|  | # A list of ignored prefixes for module index sorting. | ||||||
|  | # modindex_common_prefix = [] | ||||||
|  | 
 | ||||||
|  | # If true, keep warnings as "system message" paragraphs in the built documents. | ||||||
|  | # keep_warnings = False | ||||||
|  | 
 | ||||||
|  | # If true, `todo` and `todoList` produce output, else they produce nothing. | ||||||
|  | todo_include_todos = False | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # -- Options for HTML output ---------------------------------------------- | ||||||
|  | 
 | ||||||
|  | # The theme to use for HTML and HTML Help pages.  See the documentation for | ||||||
|  | # a list of builtin themes. | ||||||
|  | # | ||||||
|  | 
 | ||||||
|  | import sys | ||||||
|  | import os.path | ||||||
|  | sys.path.append(os.path.join(os.path.dirname(__file__), | ||||||
|  |                              '../tools/sinusoidal-sphinx-theme')) | ||||||
|  | 
 | ||||||
|  | import sinusoidal_sphinx_theme | ||||||
|  | html_theme_path = sinusoidal_sphinx_theme.html_theme_path() | ||||||
|  | html_theme = 'sinusoidal_sphinx_theme' | ||||||
|  | extensions.append("sinusoidal_sphinx_theme") | ||||||
|  | html_theme_options = { | ||||||
|  |     "project_nav_name": "immer", | ||||||
|  |     "github_link" : "https://github.com/arximboldi/immer", | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Theme options are theme-specific and customize the look and feel of a theme | ||||||
|  | # further.  For a list of options available for each theme, see the | ||||||
|  | # documentation. | ||||||
|  | # | ||||||
|  | # html_theme_options = {} | ||||||
|  | 
 | ||||||
|  | # Add any paths that contain custom themes here, relative to this directory. | ||||||
|  | # html_theme_path = [] | ||||||
|  | 
 | ||||||
|  | # The name for this set of Sphinx documents. | ||||||
|  | # "<project> v<release> documentation" by default. | ||||||
|  | # | ||||||
|  | # html_title = u'immer v0.0.0' | ||||||
|  | 
 | ||||||
|  | # A shorter title for the navigation bar.  Default is the same as html_title. | ||||||
|  | # | ||||||
|  | # html_short_title = None | ||||||
|  | 
 | ||||||
|  | # The name of an image file (relative to this directory) to place at the top | ||||||
|  | # of the sidebar. | ||||||
|  | # | ||||||
|  | html_logo = '_static/logo-black.svg' | ||||||
|  | 
 | ||||||
|  | # The name of an image file (relative to this directory) to use as a favicon of | ||||||
|  | # the docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32 | ||||||
|  | # pixels large. | ||||||
|  | # | ||||||
|  | # html_favicon = None | ||||||
|  | 
 | ||||||
|  | # Add any paths that contain custom static files (such as style sheets) here, | ||||||
|  | # relative to this directory. They are copied after the builtin static files, | ||||||
|  | # so a file named "default.css" will overwrite the builtin "default.css". | ||||||
|  | html_static_path = ['_static'] | ||||||
|  | 
 | ||||||
|  | # Add any extra paths that contain custom files (such as robots.txt or | ||||||
|  | # .htaccess) here, relative to this directory. These files are copied | ||||||
|  | # directly to the root of the documentation. | ||||||
|  | # | ||||||
|  | # html_extra_path = [] | ||||||
|  | 
 | ||||||
|  | # If not None, a 'Last updated on:' timestamp is inserted at every page | ||||||
|  | # bottom, using the given strftime format. | ||||||
|  | # The empty string is equivalent to '%b %d, %Y'. | ||||||
|  | # | ||||||
|  | # html_last_updated_fmt = None | ||||||
|  | 
 | ||||||
|  | # If true, SmartyPants will be used to convert quotes and dashes to | ||||||
|  | # typographically correct entities. | ||||||
|  | # | ||||||
|  | # html_use_smartypants = True | ||||||
|  | 
 | ||||||
|  | # Custom sidebar templates, maps document names to template names. | ||||||
|  | # | ||||||
|  | # html_sidebars = {} | ||||||
|  | 
 | ||||||
|  | # Additional templates that should be rendered to pages, maps page names to | ||||||
|  | # template names. | ||||||
|  | # | ||||||
|  | # html_additional_pages = {} | ||||||
|  | 
 | ||||||
|  | # If false, no module index is generated. | ||||||
|  | # | ||||||
|  | # html_domain_indices = True | ||||||
|  | 
 | ||||||
|  | # If false, no index is generated. | ||||||
|  | # | ||||||
|  | # html_use_index = True | ||||||
|  | 
 | ||||||
|  | # If true, the index is split into individual pages for each letter. | ||||||
|  | # | ||||||
|  | # html_split_index = False | ||||||
|  | 
 | ||||||
|  | # If true, links to the reST sources are added to the pages. | ||||||
|  | # | ||||||
|  | # html_show_sourcelink = True | ||||||
|  | 
 | ||||||
|  | # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. | ||||||
|  | # | ||||||
|  | # html_show_sphinx = True | ||||||
|  | 
 | ||||||
|  | # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. | ||||||
|  | # | ||||||
|  | # html_show_copyright = True | ||||||
|  | 
 | ||||||
|  | # If true, an OpenSearch description file will be output, and all pages will | ||||||
|  | # contain a <link> tag referring to it.  The value of this option must be the | ||||||
|  | # base URL from which the finished HTML is served. | ||||||
|  | # | ||||||
|  | # html_use_opensearch = '' | ||||||
|  | 
 | ||||||
|  | # This is the file name suffix for HTML files (e.g. ".xhtml"). | ||||||
|  | # html_file_suffix = None | ||||||
|  | 
 | ||||||
|  | # Language to be used for generating the HTML full-text search index. | ||||||
|  | # Sphinx supports the following languages: | ||||||
|  | #   'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' | ||||||
|  | #   'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh' | ||||||
|  | # | ||||||
|  | # html_search_language = 'en' | ||||||
|  | 
 | ||||||
|  | # A dictionary with options for the search language support, empty by default. | ||||||
|  | # 'ja' uses this config value. | ||||||
|  | # 'zh' user can custom change `jieba` dictionary path. | ||||||
|  | # | ||||||
|  | # html_search_options = {'type': 'default'} | ||||||
|  | 
 | ||||||
|  | # The name of a javascript file (relative to the configuration directory) that | ||||||
|  | # implements a search results scorer. If empty, the default will be used. | ||||||
|  | # | ||||||
|  | # html_search_scorer = 'scorer.js' | ||||||
|  | 
 | ||||||
|  | # Output file base name for HTML help builder. | ||||||
|  | htmlhelp_basename = 'immerdoc' | ||||||
|  | 
 | ||||||
|  | # -- Options for LaTeX output --------------------------------------------- | ||||||
|  | 
 | ||||||
|  | latex_elements = { | ||||||
|  |      # The paper size ('letterpaper' or 'a4paper'). | ||||||
|  |      # | ||||||
|  |      # 'papersize': 'letterpaper', | ||||||
|  | 
 | ||||||
|  |      # The font size ('10pt', '11pt' or '12pt'). | ||||||
|  |      # | ||||||
|  |      # 'pointsize': '10pt', | ||||||
|  | 
 | ||||||
|  |      # Additional stuff for the LaTeX preamble. | ||||||
|  |      # | ||||||
|  |      # 'preamble': '', | ||||||
|  | 
 | ||||||
|  |      # Latex figure (float) alignment | ||||||
|  |      # | ||||||
|  |      # 'figure_align': 'htbp', | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Grouping the document tree into LaTeX files. List of tuples | ||||||
|  | # (source start file, target name, title, | ||||||
|  | #  author, documentclass [howto, manual, or own class]). | ||||||
|  | latex_documents = [ | ||||||
|  |     (master_doc, 'immer.tex', u'immer Documentation', | ||||||
|  |      u'Juan Pedro Bolivar Puente', 'manual'), | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | # The name of an image file (relative to this directory) to place at the top of | ||||||
|  | # the title page. | ||||||
|  | # | ||||||
|  | # latex_logo = None | ||||||
|  | 
 | ||||||
|  | # For "manual" documents, if this is true, then toplevel headings are parts, | ||||||
|  | # not chapters. | ||||||
|  | # | ||||||
|  | # latex_use_parts = False | ||||||
|  | 
 | ||||||
|  | # If true, show page references after internal links. | ||||||
|  | # | ||||||
|  | # latex_show_pagerefs = False | ||||||
|  | 
 | ||||||
|  | # If true, show URL addresses after external links. | ||||||
|  | # | ||||||
|  | # latex_show_urls = False | ||||||
|  | 
 | ||||||
|  | # Documents to append as an appendix to all manuals. | ||||||
|  | # | ||||||
|  | # latex_appendices = [] | ||||||
|  | 
 | ||||||
|  | # It false, will not define \strong, \code, 	itleref, \crossref ... but only | ||||||
|  | # \sphinxstrong, ..., \sphinxtitleref, ... To help avoid clash with user added | ||||||
|  | # packages. | ||||||
|  | # | ||||||
|  | # latex_keep_old_macro_names = True | ||||||
|  | 
 | ||||||
|  | # If false, no module index is generated. | ||||||
|  | # | ||||||
|  | # latex_domain_indices = True | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # -- Options for manual page output --------------------------------------- | ||||||
|  | 
 | ||||||
|  | # One entry per manual page. List of tuples | ||||||
|  | # (source start file, name, description, authors, manual section). | ||||||
|  | man_pages = [ | ||||||
|  |     (master_doc, 'immer', u'immer Documentation', | ||||||
|  |      [author], 1) | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | # If true, show URL addresses after external links. | ||||||
|  | # | ||||||
|  | # man_show_urls = False | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # -- Options for Texinfo output ------------------------------------------- | ||||||
|  | 
 | ||||||
|  | # Grouping the document tree into Texinfo files. List of tuples | ||||||
|  | # (source start file, target name, title, author, | ||||||
|  | #  dir menu entry, description, category) | ||||||
|  | texinfo_documents = [ | ||||||
|  |     (master_doc, 'immer', u'immer Documentation', | ||||||
|  |      author, 'immer', 'One line description of project.', | ||||||
|  |      'Miscellaneous'), | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | # Documents to append as an appendix to all manuals. | ||||||
|  | # | ||||||
|  | # texinfo_appendices = [] | ||||||
|  | 
 | ||||||
|  | # If false, no module index is generated. | ||||||
|  | # | ||||||
|  | # texinfo_domain_indices = True | ||||||
|  | 
 | ||||||
|  | # How to display URL addresses: 'footnote', 'no', or 'inline'. | ||||||
|  | # | ||||||
|  | # texinfo_show_urls = 'footnote' | ||||||
|  | 
 | ||||||
|  | # If true, do not generate a @detailmenu in the "Top" node's menu. | ||||||
|  | # | ||||||
|  | # texinfo_no_detailmenu = False | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # -- Options for Epub output ---------------------------------------------- | ||||||
|  | 
 | ||||||
|  | # Bibliographic Dublin Core info. | ||||||
|  | epub_title = project | ||||||
|  | epub_author = author | ||||||
|  | epub_publisher = author | ||||||
|  | epub_copyright = copyright | ||||||
|  | 
 | ||||||
|  | # The basename for the epub file. It defaults to the project name. | ||||||
|  | # epub_basename = project | ||||||
|  | 
 | ||||||
|  | # The HTML theme for the epub output. Since the default themes are not | ||||||
|  | # optimized for small screen space, using the same theme for HTML and epub | ||||||
|  | # output is usually not wise. This defaults to 'epub', a theme designed to save | ||||||
|  | # visual space. | ||||||
|  | # | ||||||
|  | # epub_theme = 'epub' | ||||||
|  | 
 | ||||||
|  | # The language of the text. It defaults to the language option | ||||||
|  | # or 'en' if the language is not set. | ||||||
|  | # | ||||||
|  | # epub_language = '' | ||||||
|  | 
 | ||||||
|  | # The scheme of the identifier. Typical schemes are ISBN or URL. | ||||||
|  | # epub_scheme = '' | ||||||
|  | 
 | ||||||
|  | # The unique identifier of the text. This can be a ISBN number | ||||||
|  | # or the project homepage. | ||||||
|  | # | ||||||
|  | # epub_identifier = '' | ||||||
|  | 
 | ||||||
|  | # A unique identification for the text. | ||||||
|  | # | ||||||
|  | # epub_uid = '' | ||||||
|  | 
 | ||||||
|  | # A tuple containing the cover image and cover page html template filenames. | ||||||
|  | # | ||||||
|  | # epub_cover = () | ||||||
|  | 
 | ||||||
|  | # A sequence of (type, uri, title) tuples for the guide element of content.opf. | ||||||
|  | # | ||||||
|  | # epub_guide = () | ||||||
|  | 
 | ||||||
|  | # HTML files that should be inserted before the pages created by sphinx. | ||||||
|  | # The format is a list of tuples containing the path and title. | ||||||
|  | # | ||||||
|  | # epub_pre_files = [] | ||||||
|  | 
 | ||||||
|  | # HTML files that should be inserted after the pages created by sphinx. | ||||||
|  | # The format is a list of tuples containing the path and title. | ||||||
|  | # | ||||||
|  | # epub_post_files = [] | ||||||
|  | 
 | ||||||
|  | # A list of files that should not be packed into the epub file. | ||||||
|  | epub_exclude_files = ['search.html'] | ||||||
|  | 
 | ||||||
|  | # The depth of the table of contents in toc.ncx. | ||||||
|  | # | ||||||
|  | # epub_tocdepth = 3 | ||||||
|  | 
 | ||||||
|  | # Allow duplicate toc entries. | ||||||
|  | # | ||||||
|  | # epub_tocdup = True | ||||||
|  | 
 | ||||||
|  | # Choose between 'default' and 'includehidden'. | ||||||
|  | # | ||||||
|  | # epub_tocscope = 'default' | ||||||
|  | 
 | ||||||
|  | # Fix unsupported image types using the Pillow. | ||||||
|  | # | ||||||
|  | # epub_fix_images = False | ||||||
|  | 
 | ||||||
|  | # Scale large images. | ||||||
|  | # | ||||||
|  | # epub_max_image_width = 0 | ||||||
|  | 
 | ||||||
|  | # How to display URL addresses: 'footnote', 'no', or 'inline'. | ||||||
|  | # | ||||||
|  | # epub_show_urls = 'inline' | ||||||
|  | 
 | ||||||
|  | # If false, no index is generated. | ||||||
|  | # | ||||||
|  | # epub_use_index = True | ||||||
							
								
								
									
										50
									
								
								third_party/immer/doc/containers.rst
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								third_party/immer/doc/containers.rst
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,50 @@ | ||||||
|  | .. highlight:: c++ | ||||||
|  | 
 | ||||||
|  | Containers | ||||||
|  | ========== | ||||||
|  | 
 | ||||||
|  | This section describes all the containers provided by the library. | ||||||
|  | Check the :ref:`design` section for a general discussion of these | ||||||
|  | containers and how to use them. | ||||||
|  | 
 | ||||||
|  | box | ||||||
|  | --- | ||||||
|  | 
 | ||||||
|  | .. doxygenclass:: immer::box | ||||||
|  |     :members: | ||||||
|  |     :undoc-members: | ||||||
|  | 
 | ||||||
|  | array | ||||||
|  | ----- | ||||||
|  | 
 | ||||||
|  | .. doxygenclass:: immer::array | ||||||
|  |     :members: | ||||||
|  |     :undoc-members: | ||||||
|  | 
 | ||||||
|  | vector | ||||||
|  | ------ | ||||||
|  | 
 | ||||||
|  | .. doxygenclass:: immer::vector | ||||||
|  |     :members: | ||||||
|  |     :undoc-members: | ||||||
|  | 
 | ||||||
|  | flex_vector | ||||||
|  | ----------- | ||||||
|  | 
 | ||||||
|  | .. doxygenclass:: immer::flex_vector | ||||||
|  |     :members: | ||||||
|  |     :undoc-members: | ||||||
|  | 
 | ||||||
|  | set | ||||||
|  | --- | ||||||
|  | 
 | ||||||
|  | .. doxygenclass:: immer::set | ||||||
|  |     :members: | ||||||
|  |     :undoc-members: | ||||||
|  | 
 | ||||||
|  | map | ||||||
|  | --- | ||||||
|  | 
 | ||||||
|  | .. doxygenclass:: immer::map | ||||||
|  |     :members: | ||||||
|  |     :undoc-members: | ||||||
							
								
								
									
										268
									
								
								third_party/immer/doc/design.rst
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										268
									
								
								third_party/immer/doc/design.rst
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,268 @@ | ||||||
|  | .. _design: | ||||||
|  | 
 | ||||||
|  | Design | ||||||
|  | ====== | ||||||
|  | 
 | ||||||
|  | This is a library of **immutable containers**. | ||||||
|  | 
 | ||||||
|  | These containers have all their methods marked ``const``.  Instead of | ||||||
|  | mutating them *in place*, they provide manipulation functions that | ||||||
|  | *return a new transformed value*, leaving the original value | ||||||
|  | unaltered.  In the context of data-structures, this property of | ||||||
|  | preserving old values is called **persistence**. | ||||||
|  | 
 | ||||||
|  | Most of these containers use data-structures in which these operations | ||||||
|  | can be done *efficiently*.  In particular, not all data is copied when | ||||||
|  | a new value is produced.  Instead, the new values may share, | ||||||
|  | internally, common data with other objects.  We sometimes refer to | ||||||
|  | this property as **structural sharing**.  This behaviour is | ||||||
|  | transparent to the user. | ||||||
|  | 
 | ||||||
|  | Assigment | ||||||
|  | --------- | ||||||
|  | 
 | ||||||
|  | We are sorry, we lied. These containers provide *one mutating | ||||||
|  | operation*: **assignment** --- i.e. ``operator=``. | ||||||
|  | 
 | ||||||
|  | There is a good reason: without ``operator=`` everything becomes | ||||||
|  | complicated in C++.  For example, one may not contain non-assignable | ||||||
|  | types in many standard containers, assignment would also be disabled | ||||||
|  | from your custom types holding immutable containers, and so on and so | ||||||
|  | forth. | ||||||
|  | 
 | ||||||
|  | C++ is a multi-paradigm language with an imperative core.  Thus, it is | ||||||
|  | built on the foundation that *variables* can be mutated --- | ||||||
|  | i.e. assigned to.  We don't want to ride against this tide.  What we | ||||||
|  | want to prevent is in-place *object* manipulation.  Because of C++ | ||||||
|  | semantics, *variable* assignment is defined in terms of *object | ||||||
|  | mutation*, so we have to provide *this very particular mutating | ||||||
|  | operation*, but nothing else.  Of course, you are free to mark your | ||||||
|  | variables ``const`` to completely forbid assignment. | ||||||
|  | 
 | ||||||
|  | .. warning:: | ||||||
|  | 
 | ||||||
|  |    **Assignment is not thread safe**.  When a *mutable* variable is | ||||||
|  |    shared across multiple threads, protect access using some other | ||||||
|  |    mechanism. | ||||||
|  | 
 | ||||||
|  |    For obvious reasons, all other methods, which are ``const``, are | ||||||
|  |    thread-safe.  It is safe to share *immutable* state across multiple | ||||||
|  |    threads. | ||||||
|  | 
 | ||||||
|  | To ``const`` or not to ``const`` | ||||||
|  | -------------------------------- | ||||||
|  | 
 | ||||||
|  | Many C++ programmers, influenced by functional programming, are trying | ||||||
|  | to escape the evils of mutability by using ``const`` whenever | ||||||
|  | possible.  We also do it ourselves in many of our examples to | ||||||
|  | reinforce the property of immutability. | ||||||
|  | 
 | ||||||
|  | While in general this is a good practice backed up with very good | ||||||
|  | intentions, it has one caveat: *it disables moveability*.  It does so | ||||||
|  | even when ``std::move()`` is used.  This makes sense, since moving from | ||||||
|  | an object may mutate it, and ``const``, my friends, prevents *all* | ||||||
|  | mutations.  For example: | ||||||
|  | 
 | ||||||
|  | .. literalinclude:: ../example/vector/move.cpp | ||||||
|  |    :language: c++ | ||||||
|  |    :start-after: move-bad/start | ||||||
|  |    :end-before:  move-bad/end | ||||||
|  | 
 | ||||||
|  | One may think that the variable ``v`` is moved into the | ||||||
|  | ``push_back()`` call.  This is not the case, because the variable | ||||||
|  | ``v`` is marked ``const``.  Of course, one may enable the move by | ||||||
|  | removing it, as in: | ||||||
|  | 
 | ||||||
|  | .. literalinclude:: ../example/vector/move.cpp | ||||||
|  |    :language: c++ | ||||||
|  |    :start-after: move-good/start | ||||||
|  |    :end-before:  move-good/end | ||||||
|  | 
 | ||||||
|  | So, is it bad style then to use ``const`` as much as possible?  I | ||||||
|  | wouldn't say so and it is advisable when ``std::move()`` is not used. | ||||||
|  | An alternative style is to not use ``const`` but adopt an `AAA-style | ||||||
|  | <aaa>`_ (*Almost Always use Auto*).  This way, it is easy to look for | ||||||
|  | mutations by looking for lines that contain ``=`` but no ``auto``. | ||||||
|  | Remember that when using our immutable containers ``operator=`` is the | ||||||
|  | only way to mutate a variable. | ||||||
|  | 
 | ||||||
|  | .. _aaa: https://herbsutter.com/2013/08/12/gotw-94-solution-aaa-style-almost-always-auto/ | ||||||
|  | 
 | ||||||
|  | .. admonition:: Why does ``const`` prevent move semantics? | ||||||
|  | 
 | ||||||
|  |    For those adventurous into the grainy details C++, here is why. | ||||||
|  |    ``std::move()`` does not move anything, it is just *a cast* from | ||||||
|  |    normal *l-value* references (``T&``) to *r-value* reference | ||||||
|  |    (``T&&``).  This is, you pass it a variable, and it returns a | ||||||
|  |    reference to its object disguised as an intermediate result.  In | ||||||
|  |    exchange, you promise not to do anything with this variable later | ||||||
|  |    [#f1]_. It is the role of the thing that *receives the moved-from | ||||||
|  |    value* (in the previous example, ``push_back``) to actually do | ||||||
|  |    anything interesting with it --- for example, steal its contents | ||||||
|  |    😈. | ||||||
|  | 
 | ||||||
|  |    So if you pass a ``T&`` to ``std::move()`` you get a ``T&&`` and, | ||||||
|  |    unsurprisingly, if you pass a ``const T&`` you get a ``const T&&``. | ||||||
|  |    But the receivers of the moved-from value (like constructors or our | ||||||
|  |    ``push_back()``) maybe be moved-into because they provide an | ||||||
|  |    overload that expects ``T&&`` --- without the ``const``!  Since a | ||||||
|  |    ``const T&&`` can not be converted into a ``T&&``, the compiler | ||||||
|  |    looks up for you another viable overload, and most often finds a | ||||||
|  |    copy constructor or something alike that expects a ``const T&`` or | ||||||
|  |    just ``T``, to which a ``const T&&`` can be converted.  The code | ||||||
|  |    compiles and works correctly, but it is less efficient than we | ||||||
|  |    expected.  Our call to ``std::move()`` was fruitless. | ||||||
|  | 
 | ||||||
|  |    .. [#f1] For the sake of completeness: it is actually allowed to do stuff | ||||||
|  |             with the variable *after another value is assigned to it*. | ||||||
|  | 
 | ||||||
|  | .. _move-semantics: | ||||||
|  | 
 | ||||||
|  | Leveraging move semantics | ||||||
|  | ------------------------- | ||||||
|  | 
 | ||||||
|  | When using :ref:`reference counting<rc>` (which is the default) | ||||||
|  | mutating operations can often be faster when operating on *r-value | ||||||
|  | references* (temporaries and moved-from values).  Note that this | ||||||
|  | removes *persistence*, since one can not access the moved-from value | ||||||
|  | anymore!  However, this may be a good idea when doing a chain of | ||||||
|  | operations where the intermediate values are not important to us. | ||||||
|  | 
 | ||||||
|  | For example, let's say we want to write a function that inserts all | ||||||
|  | integers in the range :math:`[first, last)` into an immutable vector. | ||||||
|  | From the point of view of the caller of the function, this function is | ||||||
|  | a *transaction*.  Whatever intermediate vectors are generated inside | ||||||
|  | of it can be discarded since the caller can only see the initial | ||||||
|  | vector (the one passed in as argument) and the vector with *all* the | ||||||
|  | elements.  We may write such function like this: | ||||||
|  | 
 | ||||||
|  | .. literalinclude:: ../example/vector/iota-move.cpp | ||||||
|  |    :language: c++ | ||||||
|  |    :start-after: myiota/start | ||||||
|  |    :end-before:  myiota/end | ||||||
|  | 
 | ||||||
|  | The intermediate values are *moved* into the next ``push_back()`` | ||||||
|  | call.  They are going to be discarded anyways, this little | ||||||
|  | ``std::move`` just makes the whole thing faster, letting ``push_back`` | ||||||
|  | mutate part of the internal data structure in place when possible. | ||||||
|  | 
 | ||||||
|  | If you don't like this syntax, :doc:`transients<transients>` may be | ||||||
|  | used to obtain similar performance benefits. | ||||||
|  | 
 | ||||||
|  | .. admonition:: Assigment guarantees | ||||||
|  | 
 | ||||||
|  |    From the language point of view, the only requirement on moved from | ||||||
|  |    values is that they should still be destructible.  We provide the | ||||||
|  |    following two additional guarantees: | ||||||
|  | 
 | ||||||
|  |    - **It is valid to assign to a moved-from variable**.  The variable | ||||||
|  |      gets the assigned value and becomes usable again.  This is the | ||||||
|  |      behaviour of standard types. | ||||||
|  | 
 | ||||||
|  |    - **It is valid to assign a moved-from variable to itself**.  For | ||||||
|  |      most standard types this is *undefined behaviour*.  However, for our | ||||||
|  |      immutable containers types, expressions of the form ``v = | ||||||
|  |      std::move(v)`` are well-defined. | ||||||
|  | 
 | ||||||
|  | Recursive types | ||||||
|  | --------------- | ||||||
|  | 
 | ||||||
|  | Most containers will fail to be instantiated with a type of unknown | ||||||
|  | size, this is, an *incomplete type*.  This prevents using them for | ||||||
|  | building recursive types.  The following code fails to compile: | ||||||
|  | 
 | ||||||
|  | .. code-block:: c++ | ||||||
|  | 
 | ||||||
|  |   struct my_type | ||||||
|  |   { | ||||||
|  |       int data; | ||||||
|  |       immer::vector<my_type> children; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  | However, we can easily workaround this by using an ``immer::box`` to wrap | ||||||
|  | the elements in the vector, as in: | ||||||
|  | 
 | ||||||
|  | .. code-block:: c++ | ||||||
|  | 
 | ||||||
|  |   struct my_type | ||||||
|  |   { | ||||||
|  |       int data; | ||||||
|  |       immer::vector<immer::box<my_type>> children; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  | .. admonition:: Standard containers and incomplete types | ||||||
|  | 
 | ||||||
|  |   While the first example might seem to compile when using some | ||||||
|  |   implementations of ``std::vector`` instead of ``immer::vector``, such | ||||||
|  |   use is actually forbidden by the standard: | ||||||
|  | 
 | ||||||
|  |     **17.6.4.8** *Other functions (...)* 2. the effects are undefined in | ||||||
|  |     the following cases: (...) In particular---if an incomplete type (3.9) | ||||||
|  |     is used as a template argument when instantiating a template | ||||||
|  |     component, unless specifically allowed for that component. | ||||||
|  | 
 | ||||||
|  | .. _batch-update: | ||||||
|  | Efficient batch manipulations | ||||||
|  | ----------------------------- | ||||||
|  | 
 | ||||||
|  | Sometimes you may write a function that needs to do multiple changes | ||||||
|  | to a container.  Like most code you write with this library, this | ||||||
|  | function is *pure*: it takes one container value in, and produces a | ||||||
|  | new container value out, no side-effects. | ||||||
|  | 
 | ||||||
|  | Let's say we want to write a function that inserts all integers in the | ||||||
|  | range :math:`[first, last)` into an immutable vector: | ||||||
|  | 
 | ||||||
|  | .. literalinclude:: ../example/vector/iota-slow.cpp | ||||||
|  |    :language: c++ | ||||||
|  |    :start-after: include:myiota/start | ||||||
|  |    :end-before:  include:myiota/end | ||||||
|  | 
 | ||||||
|  | This function works as expected, but it is slower than necessary. | ||||||
|  | On every loop iteration, a new value is produced, just to be | ||||||
|  | forgotten in the next iteration. | ||||||
|  | 
 | ||||||
|  | Instead, we can grab a mutable view on the value, a :ref:`transient`. | ||||||
|  | Then, we manipulate it *in-place*.  When we are done with it, we | ||||||
|  | extract back an immutable value from it.  The code now looks like | ||||||
|  | this: | ||||||
|  | 
 | ||||||
|  | .. _iota-transient: | ||||||
|  | 
 | ||||||
|  | .. literalinclude:: ../example/vector/iota-transient.cpp | ||||||
|  |    :language: c++ | ||||||
|  |    :start-after: include:myiota/start | ||||||
|  |    :end-before:  include:myiota/end | ||||||
|  | 
 | ||||||
|  | Both conversions are :math:`O(1)`.  Note that calling ``transient()`` | ||||||
|  | does not break the immutability of the variable it is called on.  The | ||||||
|  | new mutable object will adopt its contents, but when a mutation is | ||||||
|  | performed, it will copy the data necessary using *copy on write*. | ||||||
|  | Subsequent manipulations may hit parts that have already been copied, | ||||||
|  | and these changes are done in-place.  Because of this, it does not | ||||||
|  | make sense to use transients to do only one change. | ||||||
|  | 
 | ||||||
|  | .. tip:: | ||||||
|  | 
 | ||||||
|  |    Note that :ref:`move semantics<move-semantics>` can be used instead to | ||||||
|  |    support a similar use-case.  However, transients optimise updates | ||||||
|  |    even when reference counting is disabled. | ||||||
|  | 
 | ||||||
|  | .. _std-compat: | ||||||
|  | Standard library compatibility | ||||||
|  | ------------------------------ | ||||||
|  | 
 | ||||||
|  | While the immutable containers provide an interface that follows a | ||||||
|  | functional style, this is incompatible with what the standard library | ||||||
|  | algorithms sometimes expect. :ref:`transients` try to provide an | ||||||
|  | interface as similar as possible to similar standard library | ||||||
|  | containers.  Thus, can also be used to interoperate with standard | ||||||
|  | library components. | ||||||
|  | 
 | ||||||
|  | For example the :ref:`myiota() function above<iota-transient>` may as | ||||||
|  | well be written using standard library tools: | ||||||
|  | 
 | ||||||
|  | .. literalinclude:: ../example/vector/iota-transient-std.cpp | ||||||
|  |    :language: c++ | ||||||
|  |    :start-after: include:myiota/start | ||||||
|  |    :end-before:  include:myiota/end | ||||||
							
								
								
									
										23
									
								
								third_party/immer/doc/doxygen.config
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								third_party/immer/doc/doxygen.config
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,23 @@ | ||||||
|  | PROJECT_NAME     = "immer" | ||||||
|  | OUTPUT_DIRECTORY = _doxygen | ||||||
|  | GENERATE_LATEX   = NO | ||||||
|  | GENERATE_MAN     = NO | ||||||
|  | GENERATE_RTF     = NO | ||||||
|  | GENERATE_HTML    = NO | ||||||
|  | GENERATE_XML     = YES | ||||||
|  | INPUT            = \ | ||||||
|  |                  ../immer \ | ||||||
|  |                  ../immer/heap \ | ||||||
|  |                  ../immer/refcount \ | ||||||
|  |                  ../immer/transience | ||||||
|  | INCLUDE_PATH     = .. | ||||||
|  | QUIET            = YES | ||||||
|  | 
 | ||||||
|  | JAVADOC_AUTOBRIEF = YES | ||||||
|  | ENABLE_PREPROCESSING = YES | ||||||
|  | MARKDOWN_SUPPORT = YES | ||||||
|  | MACRO_EXPANSION = YES | ||||||
|  | 
 | ||||||
|  | ALIASES  = "rst=\verbatim embed:rst:leading-asterisk\n" | ||||||
|  | ALIASES += "endrst=\n\endverbatim" | ||||||
|  | ALIASES += "rst{1}=\rst\1\endrst" | ||||||
							
								
								
									
										1
									
								
								third_party/immer/doc/guile.rst
									
										
									
									
										vendored
									
									
										Symbolic link
									
								
							
							
						
						
									
										1
									
								
								third_party/immer/doc/guile.rst
									
										
									
									
										vendored
									
									
										Symbolic link
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | ../extra/guile/README.rst | ||||||
							
								
								
									
										6
									
								
								third_party/immer/doc/implementation.rst
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								third_party/immer/doc/implementation.rst
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,6 @@ | ||||||
|  | Implementation overview | ||||||
|  | ======================= | ||||||
|  | 
 | ||||||
|  | .. image:: https://upload.wikimedia.org/wikipedia/commons/e/e6/%22Work_in_progress%22%2C_animated.gif | ||||||
|  |    :alt: Work in Progress | ||||||
|  |    :align: center | ||||||
							
								
								
									
										31
									
								
								third_party/immer/doc/index.rst
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								third_party/immer/doc/index.rst
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,31 @@ | ||||||
|  | 
 | ||||||
|  | .. include:: ../README.rst | ||||||
|  |    :end-before: include:index/end | ||||||
|  | 
 | ||||||
|  | Contents | ||||||
|  | -------- | ||||||
|  | 
 | ||||||
|  | .. toctree:: | ||||||
|  |    :caption: User Manual | ||||||
|  |    :maxdepth: 3 | ||||||
|  | 
 | ||||||
|  |    introduction | ||||||
|  |    design | ||||||
|  |    containers | ||||||
|  |    transients | ||||||
|  |    algorithms | ||||||
|  |    utilities | ||||||
|  |    memory | ||||||
|  | 
 | ||||||
|  | .. toctree:: | ||||||
|  |    :caption: Experimental | ||||||
|  |    :maxdepth: 3 | ||||||
|  | 
 | ||||||
|  |    python | ||||||
|  |    guile | ||||||
|  | 
 | ||||||
|  | ---- | ||||||
|  | 
 | ||||||
|  | * :ref:`genindex` | ||||||
|  | * :ref:`modindex` | ||||||
|  | * :ref:`search` | ||||||
							
								
								
									
										6
									
								
								third_party/immer/doc/introduction.rst
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								third_party/immer/doc/introduction.rst
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,6 @@ | ||||||
|  | 
 | ||||||
|  | Introduction | ||||||
|  | ============ | ||||||
|  | 
 | ||||||
|  | .. include:: ../README.rst | ||||||
|  |    :start-after: include:introduction/start | ||||||
							
								
								
									
										204
									
								
								third_party/immer/doc/memory.rst
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										204
									
								
								third_party/immer/doc/memory.rst
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,204 @@ | ||||||
|  | Memory management | ||||||
|  | ================= | ||||||
|  | 
 | ||||||
|  | Memory management is specially important for immutable data | ||||||
|  | structures.  This is mainly due to: | ||||||
|  | 
 | ||||||
|  | #. In order to preserve the old value, new memory has to be allocated | ||||||
|  |    to store the new data whenever a container is manipulated.  Thus, | ||||||
|  |    more allocations are performed *when changing* than with traditional | ||||||
|  |    mutable data structures. | ||||||
|  | 
 | ||||||
|  | #. In order to support *structural sharing* transparently, some kind | ||||||
|  |    of garbage collection mechanism is required.  Passing immutable | ||||||
|  |    data structures around is, internally, just passing references, | ||||||
|  |    thus the system needs to figure out somehow when old values are not | ||||||
|  |    referenced anymore and should be deallocated. | ||||||
|  | 
 | ||||||
|  | Thus, most containers in this library can be customized via policies_ | ||||||
|  | in order to use different *allocation* and *garbage collection* | ||||||
|  | strategies. | ||||||
|  | 
 | ||||||
|  | .. doxygentypedef:: immer::default_memory_policy | ||||||
|  | .. doxygentypedef:: immer::default_heap_policy | ||||||
|  | .. doxygentypedef:: immer::default_refcount_policy | ||||||
|  | 
 | ||||||
|  | .. _policies: https://en.wikipedia.org/wiki/Policy-based_design | ||||||
|  | 
 | ||||||
|  | .. _memory policy: | ||||||
|  | 
 | ||||||
|  | Memory policy | ||||||
|  | ------------- | ||||||
|  | 
 | ||||||
|  | .. doxygenstruct:: immer::memory_policy | ||||||
|  |     :members: | ||||||
|  |     :undoc-members: | ||||||
|  | 
 | ||||||
|  | .. _gc: | ||||||
|  | 
 | ||||||
|  | Example: tracing garbage collection | ||||||
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
|  | 
 | ||||||
|  | It is note worthy that all aspects of a | ||||||
|  | :cpp:class:`immer::memory_policy` are not completely orthogonal. | ||||||
|  | 
 | ||||||
|  | Let's say you want to use a `tracing garbage collector`_. Actually, we | ||||||
|  | already provide :cpp:class:`a heap <immer::gc_heap>` that interfaces | ||||||
|  | with the `Boehm's conservative garbage collector`_.  Chunks of memory | ||||||
|  | allocated with this heap do not need to be deallocated, instead, after | ||||||
|  | a certain number of allocations, the heap itself will scan the stack | ||||||
|  | and all allocated memory to find references to other blocks of memory. | ||||||
|  | The memory that is not referenced anymore is automatically *freed*. | ||||||
|  | Thus, no reference counting mechanism is needed, and it makes no sense | ||||||
|  | to use this heap with anything else than the | ||||||
|  | :cpp:class:`immer::no_refcount_policy`.  Also, a big object can be | ||||||
|  | separated in parts that contain pointers and parts that do not, which | ||||||
|  | make scanning references faster.  So it makes most sense to use | ||||||
|  | ``prefer_fewer_bigger_objects = false``. | ||||||
|  | 
 | ||||||
|  | .. note:: There are few considerations to note when using | ||||||
|  |           :cpp:class:`gc_heap` with containers.  Please make sure to | ||||||
|  |           read :cpp:class:`its documentation section <immer::gc_heap>` | ||||||
|  |           before using it. | ||||||
|  | 
 | ||||||
|  | .. literalinclude:: ../example/vector/gc.cpp | ||||||
|  |    :language: c++ | ||||||
|  |    :start-after: example/start | ||||||
|  |    :end-before:  example/end | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | .. _boehm's conservative garbage collector: https://github.com/ivmai/bdwgc | ||||||
|  | .. _tracing garbage collector: https://en.wikipedia.org/wiki/Tracing_garbage_collection | ||||||
|  | 
 | ||||||
|  | Heaps | ||||||
|  | ----- | ||||||
|  | 
 | ||||||
|  | A **heap policy** is a `metafunction class`_ that given the sizes of | ||||||
|  | the objects that we want to allocate, it *returns* a heap that can | ||||||
|  | allocate objects of those sizes. | ||||||
|  | 
 | ||||||
|  | .. _metafunction class: http://www.boost.org/doc/libs/1_62_0/libs/mpl/doc/refmanual/metafunction-class.html | ||||||
|  | 
 | ||||||
|  | A **heap** is a type with a methods ``void* allocate(std::size_t)`` | ||||||
|  | and ``void deallocate(void*)`` that return and release raw memory. | ||||||
|  | For a canonical model of this concept check the | ||||||
|  | :cpp:class:`immer::cpp_heap`. | ||||||
|  | 
 | ||||||
|  | .. note:: Currently, *heaps* can only have **global state**.  Having | ||||||
|  |           internal state poses conceptual problems for immutable data | ||||||
|  |           structures: should a `const` method of a container modify | ||||||
|  |           its internal allocator state?  Should every immutable | ||||||
|  |           container object have its own internal state, or new objects | ||||||
|  |           made from another one just keep a reference to the allocator | ||||||
|  |           of the parent? | ||||||
|  | 
 | ||||||
|  |           On the other hand, having some **scoped state** does make | ||||||
|  |           sense for some use-cases of immutable data structures.  For | ||||||
|  |           example, we might want to support variations of `region | ||||||
|  |           based allocation`_.  This interface might evolve to evolve | ||||||
|  |           to support some kind of non-global state to accommodate | ||||||
|  |           these use cases. | ||||||
|  | 
 | ||||||
|  | .. _region based allocation: https://en.wikipedia.org/wiki/Region-based_memory_management | ||||||
|  | 
 | ||||||
|  | .. admonition:: Why not use the standard allocator interface? | ||||||
|  | 
 | ||||||
|  |    The standard allocator API was not designed to support different | ||||||
|  |    allocation strategies, but to abstract over the underlying memory | ||||||
|  |    model instead.  In C++11 the situation improves, but the new API is | ||||||
|  |    *stateful*, posing various challenges as described in the previous | ||||||
|  |    note.  So far it was easier to provide our own allocation | ||||||
|  |    interface.  In the future, we will provide adaptors so | ||||||
|  |    standard-compatible allocators can also be used with ``immer``. | ||||||
|  | 
 | ||||||
|  | Heap policies | ||||||
|  | ~~~~~~~~~~~~~ | ||||||
|  | 
 | ||||||
|  | .. doxygenstruct:: immer::heap_policy | ||||||
|  |    :members: | ||||||
|  |    :undoc-members: | ||||||
|  | 
 | ||||||
|  | .. doxygenstruct:: immer::free_list_heap_policy | ||||||
|  | 
 | ||||||
|  | Standard heap | ||||||
|  | ~~~~~~~~~~~~~ | ||||||
|  | 
 | ||||||
|  | .. doxygenstruct:: immer::cpp_heap | ||||||
|  |    :members: | ||||||
|  | 
 | ||||||
|  | Malloc heap | ||||||
|  | ~~~~~~~~~~~ | ||||||
|  | 
 | ||||||
|  | .. doxygenstruct:: immer::malloc_heap | ||||||
|  |    :members: | ||||||
|  | 
 | ||||||
|  | Garbage collected heap | ||||||
|  | ~~~~~~~~~~~~~~~~~~~~~~ | ||||||
|  | 
 | ||||||
|  | .. doxygenclass:: immer::gc_heap | ||||||
|  | 
 | ||||||
|  | Heap adaptors | ||||||
|  | ~~~~~~~~~~~~~ | ||||||
|  | 
 | ||||||
|  | Inspired by `Andrei Alexandrescu's talk on allocators <allocation | ||||||
|  | vexation>`_ and `Emery Berger's heap layers <heap layers>`_ we provide | ||||||
|  | allocator adaptors that can be combined using C++ mixins.  These | ||||||
|  | enable building more complex allocator out of simpler strategies, or | ||||||
|  | provide application specific optimizations on top of general | ||||||
|  | allocators. | ||||||
|  | 
 | ||||||
|  | .. _allocation vexation: https://www.youtube.com/watch?v=LIb3L4vKZ7U | ||||||
|  | .. _heap layers: https://github.com/emeryberger/Heap-Layers | ||||||
|  | 
 | ||||||
|  | .. doxygenstruct:: immer::with_data | ||||||
|  | 
 | ||||||
|  | .. doxygenstruct:: immer::free_list_heap | ||||||
|  | 
 | ||||||
|  | .. doxygenstruct:: immer::thread_local_free_list_heap | ||||||
|  | 
 | ||||||
|  | .. doxygenstruct:: immer::unsafe_free_list_heap | ||||||
|  | 
 | ||||||
|  | .. doxygenstruct:: immer::identity_heap | ||||||
|  | 
 | ||||||
|  | .. doxygenstruct:: immer::debug_size_heap | ||||||
|  | 
 | ||||||
|  | .. doxygenstruct:: immer::split_heap | ||||||
|  | 
 | ||||||
|  | .. _rc: | ||||||
|  | 
 | ||||||
|  | Reference counting | ||||||
|  | ------------------ | ||||||
|  | 
 | ||||||
|  | `Reference counting`_ is the most commonly used garbage collection | ||||||
|  | strategy for C++.  It can be implemented non-intrusively, in a way | ||||||
|  | orthogonal to the allocation strategy. It is deterministic, playing | ||||||
|  | well with RAII_. | ||||||
|  | 
 | ||||||
|  | A `memory policy`_ can provide a reference counting strategy that | ||||||
|  | containers can use to track their contents. | ||||||
|  | 
 | ||||||
|  | .. _reference counting: https://en.wikipedia.org/wiki/Reference_counting | ||||||
|  | .. _raii: https://en.wikipedia.org/wiki/Resource_acquisition_is_initialization | ||||||
|  | 
 | ||||||
|  | .. doxygenstruct:: immer::refcount_policy | ||||||
|  | 
 | ||||||
|  | .. doxygenstruct:: immer::unsafe_refcount_policy | ||||||
|  | 
 | ||||||
|  | .. doxygenstruct:: immer::no_refcount_policy | ||||||
|  | 
 | ||||||
|  | Transience | ||||||
|  | ---------- | ||||||
|  | 
 | ||||||
|  | In order to support `transients`, it is needed to provide a mechanism | ||||||
|  | to track the ownership of the data allocated inside the container. | ||||||
|  | This concept is encapsulated in *transience policies*. | ||||||
|  | 
 | ||||||
|  | Note that when :ref:`reference counting <rc>` is available, no such mechanism is | ||||||
|  | needed.  However, when :ref:`tracing garbage collection<gc>` is used instead, | ||||||
|  | a special policy has to be provided.  Otherwise, the transient API is | ||||||
|  | still available, but it will perform poorly, since it won't be able to | ||||||
|  | mutate any data in place. | ||||||
|  | 
 | ||||||
|  | .. doxygenstruct:: immer::no_transience_policy | ||||||
|  | 
 | ||||||
|  | .. doxygenstruct:: immer::gc_transience_policy | ||||||
							
								
								
									
										1
									
								
								third_party/immer/doc/python.rst
									
										
									
									
										vendored
									
									
										Symbolic link
									
								
							
							
						
						
									
										1
									
								
								third_party/immer/doc/python.rst
									
										
									
									
										vendored
									
									
										Symbolic link
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | ../extra/python/README.rst | ||||||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue