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