| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | /* | ||
| 2 | * Copyright (c) 2000-2022 Inria | ||
| 3 | * All rights reserved. | ||
| 4 | * | ||
| 5 | * Redistribution and use in source and binary forms, with or without | ||
| 6 | * modification, are permitted provided that the following conditions are met: | ||
| 7 | * | ||
| 8 | * * Redistributions of source code must retain the above copyright notice, | ||
| 9 | * this list of conditions and the following disclaimer. | ||
| 10 | * * Redistributions in binary form must reproduce the above copyright notice, | ||
| 11 | * this list of conditions and the following disclaimer in the documentation | ||
| 12 | * and/or other materials provided with the distribution. | ||
| 13 | * * Neither the name of the ALICE Project-Team nor the names of its | ||
| 14 | * contributors may be used to endorse or promote products derived from this | ||
| 15 | * software without specific prior written permission. | ||
| 16 | * | ||
| 17 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||
| 18 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
| 19 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
| 20 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||
| 21 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||
| 22 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||
| 23 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||
| 24 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||
| 25 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||
| 26 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 27 | * POSSIBILITY OF SUCH DAMAGE. | ||
| 28 | * | ||
| 29 | * Contact: Bruno Levy | ||
| 30 | * | ||
| 31 | * https://www.inria.fr/fr/bruno-levy | ||
| 32 | * | ||
| 33 | * Inria, | ||
| 34 | * Domaine de Voluceau, | ||
| 35 | * 78150 Le Chesnay - Rocquencourt | ||
| 36 | * FRANCE | ||
| 37 | * | ||
| 38 | */ | ||
| 39 | |||
| 40 | #ifndef GEOGRAM_BASIC_MEMORY | ||
| 41 | #define GEOGRAM_BASIC_MEMORY | ||
| 42 | |||
| 43 | #include <geogram/basic/common.h> | ||
| 44 | #include <geogram/basic/assert.h> | ||
| 45 | #include <geogram/basic/numeric.h> | ||
| 46 | #include <geogram/basic/argused.h> | ||
| 47 | #include <vector> | ||
| 48 | #include <new> | ||
| 49 | #include <string.h> | ||
| 50 | #include <stdlib.h> | ||
| 51 | |||
| 52 | #ifdef GEO_OS_WINDOWS | ||
| 53 | |||
| 54 | #include <windows.h> | ||
| 55 | #ifdef min | ||
| 56 | #undef min | ||
| 57 | #endif | ||
| 58 | #ifdef max | ||
| 59 | #undef max | ||
| 60 | #endif | ||
| 61 | |||
| 62 | #else | ||
| 63 | |||
| 64 | #include <unistd.h> | ||
| 65 | |||
| 66 | #endif | ||
| 67 | |||
| 68 | // Stack size depending on OS: | ||
| 69 | // Linux: 10 Mb | ||
| 70 | // Windows: 1 Mb | ||
| 71 | // Mac OSX: 512 Kb | ||
| 72 | // GEO_HAS_BIG_STACK is defined under Linux | ||
| 73 | // and lets some of the functions that | ||
| 74 | // manipulate exact precision numbers | ||
| 75 | // allocate temporaries on the stack. | ||
| 76 | |||
| 77 | #ifdef GEO_OS_LINUX | ||
| 78 | #define GEO_HAS_BIG_STACK | ||
| 79 | #endif | ||
| 80 | |||
| 81 | /** | ||
| 82 | * \file geogram/basic/memory.h | ||
| 83 | * \brief Types and functions for memory manipulation | ||
| 84 | */ | ||
| 85 | |||
| 86 | namespace GEO { | ||
| 87 | |||
| 88 | /** | ||
| 89 | * \brief Utilities for memory management. | ||
| 90 | */ | ||
| 91 | namespace Memory { | ||
| 92 | /** \brief Unsigned byte type */ | ||
| 93 | typedef unsigned char byte; | ||
| 94 | |||
| 95 | /** \brief Unsigned 8 bits integer */ | ||
| 96 | typedef unsigned char word8; | ||
| 97 | |||
| 98 | /** \brief Unsigned 16 bits integer */ | ||
| 99 | typedef unsigned short word16; | ||
| 100 | |||
| 101 | /** \brief Unsigned 32 bits integer */ | ||
| 102 | typedef unsigned int word32; | ||
| 103 | |||
| 104 | /** \brief Pointer to unsigned byte(s) */ | ||
| 105 | typedef byte* pointer; | ||
| 106 | |||
| 107 | /** \brief Const pointer to unsigned byte(s) */ | ||
| 108 | typedef const byte* const_pointer; | ||
| 109 | |||
| 110 | /** \brief Generic function pointer */ | ||
| 111 | typedef void (*function_pointer)(); | ||
| 112 | |||
| 113 | /** | ||
| 114 | * \brief Clears a memory block | ||
| 115 | * \details Clears (set to zero) the first \p size bytes of array \p | ||
| 116 | * addr. | ||
| 117 | * \param[in] addr an array of bytes | ||
| 118 | * \param[in] size the number of bytes to clear | ||
| 119 | */ | ||
| 120 | inline void clear(void* addr, size_t size) { | ||
| 121 | ::memset(addr, 0, size); | ||
| 122 | 209858 | } | |
| 123 | |||
| 124 | /** | ||
| 125 | * \brief Copies a memory block | ||
| 126 | * \details Copies the first \p size bytes of array \p from to array | ||
| 127 | * \p to. Note that this function has unpredictable results if the | ||
| 128 | * memory areas pointed to by \p to and \p from overlap. | ||
| 129 | * \param[in] to the destination array of bytes | ||
| 130 | * \param[in] from the array of bytes to copy | ||
| 131 | * \param[in] size the number of bytes to copy | ||
| 132 | */ | ||
| 133 | inline void copy(void* to, const void* from, size_t size) { | ||
| 134 | ::memcpy(to, from, size); | ||
| 135 | 4217530 | } | |
| 136 | |||
| 137 | /** | ||
| 138 | * \brief Converts a function pointer to a generic pointer. | ||
| 139 | * \details In C++ it is not legal to convert between function pointers | ||
| 140 | * and generic pointers using casts. Such conversion may be | ||
| 141 | * required when retrieving symbols in dynamically linked libraries, | ||
| 142 | * or when interfacing with scripting languages. | ||
| 143 | * \tparam FPTR function pointer type | ||
| 144 | * \param[in] fptr the function pointer | ||
| 145 | * \return a generic pointer with the same address as \p fptr | ||
| 146 | */ | ||
| 147 | template <class FPTR=function_pointer> | ||
| 148 | inline pointer function_pointer_to_generic_pointer(FPTR fptr) { | ||
| 149 | // I know this is ugly, but I did not find a simpler warning-free | ||
| 150 | // way that is portable between all compilers. | ||
| 151 | pointer result = nullptr; | ||
| 152 | ::memcpy(&result, &fptr, sizeof(pointer)); | ||
| 153 | return result; | ||
| 154 | } | ||
| 155 | |||
| 156 | /** | ||
| 157 | * \brief Converts a generic pointer to a function pointer. | ||
| 158 | * \details In C++ it is not legal to convert between function pointers | ||
| 159 | * and generic pointers using casts. Such conversion may be required | ||
| 160 | * when retrieving symbols in dynamically linked libraries, or when | ||
| 161 | * interfacing with scripting languages. | ||
| 162 | * \tparam FPTR function pointer type | ||
| 163 | * \param[in] ptr the generic pointer | ||
| 164 | * \return a function pointer with the same address as \p ptr | ||
| 165 | */ | ||
| 166 | template <class FPTR = function_pointer> | ||
| 167 | inline FPTR generic_pointer_to_function_pointer(pointer ptr) { | ||
| 168 | // I know this is ugly, but I did not find a simpler warning-free | ||
| 169 | // way that is portable between all compilers. | ||
| 170 | FPTR result = nullptr; | ||
| 171 | ::memcpy(&result, &ptr, sizeof(pointer)); | ||
| 172 | return result; | ||
| 173 | } | ||
| 174 | |||
| 175 | /** | ||
| 176 | * \brief Converts a generic pointer to a function pointer. | ||
| 177 | * \details In C++ it is not legal to convert between function pointers | ||
| 178 | * and generic pointers using casts. Such conversion may be | ||
| 179 | * required when retrieving symbols in dynamically linked libraries, | ||
| 180 | * or when interfacing with scripting languages. | ||
| 181 | * \tparam FPTR function pointer type | ||
| 182 | * \param[in] ptr the generic pointer | ||
| 183 | * \return a function pointer with the same address as \p ptr | ||
| 184 | */ | ||
| 185 | template <class FPTR = function_pointer> | ||
| 186 | inline FPTR generic_pointer_to_function_pointer(void* ptr) { | ||
| 187 | // I know this is ugly, but I did not find a simpler warning-free | ||
| 188 | // way that is portable between all compilers. | ||
| 189 | FPTR result = nullptr; | ||
| 190 | ::memcpy(&result, &ptr, sizeof(pointer)); | ||
| 191 | return result; | ||
| 192 | } | ||
| 193 | |||
| 194 | |||
| 195 | /** | ||
| 196 | * \brief Converts a pointer to a reference | ||
| 197 | * \tparam T the type for the reference | ||
| 198 | * \param[in] ptr the pointer | ||
| 199 | * \return a reference of type T& | ||
| 200 | */ | ||
| 201 | template <class T> inline T& pointer_as_reference(void* ptr) { | ||
| 202 | // This is the recommended way of converting between pointers | ||
| 203 | // of different types. Casting the pointer directly is undefined | ||
| 204 | // behavior. Note: the call to memcpy() is eliminated by the | ||
| 205 | // compiler (that generates the same thing as when casting the | ||
| 206 | // pointer). | ||
| 207 | T* T_ptr; | ||
| 208 | ::memcpy(&T_ptr, &ptr, sizeof(pointer)); | ||
| 209 | return *T_ptr; | ||
| 210 | } | ||
| 211 | |||
| 212 | /** | ||
| 213 | * \brief Converts a const pointer to a reference | ||
| 214 | * \tparam T the type for the reference | ||
| 215 | * \param[in] ptr the pointer | ||
| 216 | * \return a const reference of type const T& | ||
| 217 | */ | ||
| 218 | template <class T> inline const T& pointer_as_reference( | ||
| 219 | const void* ptr | ||
| 220 | ) { | ||
| 221 | // This is the recommended way of converting between pointers | ||
| 222 | // of different types. Casting the pointer directly is undefined | ||
| 223 | // behavior. Note: the call to memcpy() is eliminated by the | ||
| 224 | // compiler (that generates the same thing as when casting the | ||
| 225 | // pointer). | ||
| 226 | const T* T_ptr; | ||
| 227 | ::memcpy(&T_ptr, &ptr, sizeof(pointer)); | ||
| 228 | return *T_ptr; | ||
| 229 | } | ||
| 230 | |||
| 231 | |||
| 232 | /** | ||
| 233 | * \brief Default memory alignment for efficient vector operations | ||
| 234 | * \details The memory alignment is given in bytes. Here is a list of | ||
| 235 | * commonly used alignment values for various architectures: | ||
| 236 | * - SSE: 16 | ||
| 237 | * - AVX: 32 | ||
| 238 | * - AVX-512: 64 | ||
| 239 | */ | ||
| 240 | #define GEO_MEMORY_ALIGNMENT 64 | ||
| 241 | |||
| 242 | /** | ||
| 243 | * \brief Defines the memory alignment of points in a vector | ||
| 244 | * \details PointAlignment defines the memory alignment of points of | ||
| 245 | * dimension \p DIM when they are stored contiguously in an array. The | ||
| 246 | * alignment value is contained in the static data member \c value. | ||
| 247 | * The PointAlignment template defines a default alignment of 1. | ||
| 248 | * PointAlignment template specializations define specific values for | ||
| 249 | * the most commonly used point dimensions. | ||
| 250 | * \tparam DIM the dimension of the point. | ||
| 251 | */ | ||
| 252 | template <int DIM> | ||
| 253 | struct PointAlignment { | ||
| 254 | /** | ||
| 255 | * \brief Alignment value in bytes | ||
| 256 | * \details The default value is 1 byte. | ||
| 257 | */ | ||
| 258 | static const size_t value = 1; | ||
| 259 | }; | ||
| 260 | |||
| 261 | /** | ||
| 262 | * \brief PointAlignment specialization for points of dimension 2 | ||
| 263 | * \see PointAlignment | ||
| 264 | */ | ||
| 265 | template <> | ||
| 266 | struct PointAlignment<2> { | ||
| 267 | static const size_t value = 16; | ||
| 268 | }; | ||
| 269 | |||
| 270 | /** | ||
| 271 | * \brief PointAlignment specialization for points of dimension 3 | ||
| 272 | * \see PointAlignment | ||
| 273 | */ | ||
| 274 | template <> | ||
| 275 | struct PointAlignment<3> { | ||
| 276 | static const size_t value = 8; | ||
| 277 | }; | ||
| 278 | |||
| 279 | /** | ||
| 280 | * \brief PointAlignment specialization for points of dimension 4 | ||
| 281 | * \see PointAlignment | ||
| 282 | */ | ||
| 283 | template <> | ||
| 284 | struct PointAlignment<4> { | ||
| 285 | static const size_t value = 32; | ||
| 286 | }; | ||
| 287 | |||
| 288 | /** | ||
| 289 | * \brief PointAlignment specialization for points of dimension 6 | ||
| 290 | * \see PointAlignment | ||
| 291 | */ | ||
| 292 | template <> | ||
| 293 | struct PointAlignment<6> { | ||
| 294 | static const size_t value = 16; | ||
| 295 | }; | ||
| 296 | |||
| 297 | /** | ||
| 298 | * \brief PointAlignment specialization for points of dimension 8 | ||
| 299 | * \see PointAlignment | ||
| 300 | */ | ||
| 301 | template <> | ||
| 302 | struct PointAlignment<8> { | ||
| 303 | static const size_t value = 64; | ||
| 304 | }; | ||
| 305 | |||
| 306 | /** | ||
| 307 | * \brief Gets a point alignment | ||
| 308 | * \details This gives the alignment of a point of dimension \p dim | ||
| 309 | * within an array of points aligned on GEO_MEMORY_ALIGNMENT bytes | ||
| 310 | * \param[in] dim the dimension of the point | ||
| 311 | * \see GEO::Memory::PointAlignment | ||
| 312 | * \see GEO_MEMORY_ALIGNMENT | ||
| 313 | */ | ||
| 314 | #define geo_dim_alignment(dim) GEO::Memory::PointAlignment<dim>::value | ||
| 315 | |||
| 316 | /** | ||
| 317 | * \brief Allocates aligned memory. | ||
| 318 | * \details The address of the allocated block will be a multiple of | ||
| 319 | * \p alignment. Aligned memory blocks are required by vector | ||
| 320 | * processing instructions (SSE, AVX...) | ||
| 321 | * \param[in] size size of the block to allocate | ||
| 322 | * \param[in] alignment memory alignment (must be a power of 2) | ||
| 323 | * \note Memory alignment is not supported under Android. | ||
| 324 | */ | ||
| 325 | inline void* aligned_malloc( | ||
| 326 | size_t size, size_t alignment = GEO_MEMORY_ALIGNMENT | ||
| 327 | ) { | ||
| 328 | #if defined(GEO_OS_ANDROID) | ||
| 329 | // Alignment not supported under Android. | ||
| 330 | geo_argused(alignment); | ||
| 331 | return malloc(size); | ||
| 332 | #elif defined(GEO_COMPILER_INTEL) | ||
| 333 | return _mm_malloc(size, alignment); | ||
| 334 | #elif defined(GEO_COMPILER_GCC) || defined(GEO_COMPILER_CLANG) | ||
| 335 | void* result; | ||
| 336 | 9704 | return posix_memalign(&result, alignment, size) == 0 | |
| 337 |
12/20✗ Branch 0 not taken.
✓ Branch 1 taken 1257 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 16735 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 8858 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 100559 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 10928 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 3775 times.
✓ Branch 12 taken 153 times.
✓ Branch 13 taken 3666 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2045 times.
✓ Branch 16 taken 710 times.
✓ Branch 17 taken 390 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 2754 times.
|
151830 | ? result : nullptr; |
| 338 | #elif defined(GEO_COMPILER_MSVC) | ||
| 339 | return _aligned_malloc(size, alignment); | ||
| 340 | #else | ||
| 341 | geo_argused(alignment); | ||
| 342 | return malloc(size); | ||
| 343 | #endif | ||
| 344 | } | ||
| 345 | |||
| 346 | /** | ||
| 347 | * \brief Deallocates aligned memory | ||
| 348 | * \details Deallocates the block of memory pointed to by \p p. Note | ||
| 349 | * \p p that must have been previously allocated by aligned_malloc() | ||
| 350 | * \see aligned_malloc() | ||
| 351 | * \note Memory alignment is not supported under Android. | ||
| 352 | */ | ||
| 353 | inline void aligned_free(void* p) { | ||
| 354 | #if defined(GEO_OS_ANDROID) | ||
| 355 | // Alignment not supported under Android. | ||
| 356 | free(p); | ||
| 357 | #elif defined(GEO_COMPILER_INTEL) | ||
| 358 | _mm_free(p); | ||
| 359 | #elif defined(GEO_COMPILER_GCC_FAMILY) | ||
| 360 | 141236 | free(p); | |
| 361 | #elif defined(GEO_COMPILER_MSVC) | ||
| 362 | _aligned_free(p); | ||
| 363 | #else | ||
| 364 | free(p); | ||
| 365 | #endif | ||
| 366 | } | ||
| 367 | |||
| 368 | /** | ||
| 369 | * \def geo_decl_aligned(var) | ||
| 370 | * \brief Specifies that a given variable should be memory-aligned. | ||
| 371 | * \details | ||
| 372 | * It helps the compiler vectorizing loops, | ||
| 373 | * i.e. generating SSE/AVX/... code. | ||
| 374 | * \param[in] var a variable in the current scope | ||
| 375 | * \par Example | ||
| 376 | * \code | ||
| 377 | * geo_decl_aligned(double x); | ||
| 378 | * \endcode | ||
| 379 | * \note Memory alignment is not supported under Android. | ||
| 380 | */ | ||
| 381 | #if defined(GEO_OS_ANDROID) | ||
| 382 | #define geo_decl_aligned(var) var | ||
| 383 | #elif defined(GEO_COMPILER_INTEL) | ||
| 384 | #define geo_decl_aligned(var) __declspec(aligned(GEO_MEMORY_ALIGNMENT)) var | ||
| 385 | #elif defined(GEO_COMPILER_GCC_FAMILY) | ||
| 386 | #define geo_decl_aligned(var) var __attribute__((aligned(GEO_MEMORY_ALIGNMENT))) | ||
| 387 | #elif defined(GEO_COMPILER_MSVC) | ||
| 388 | #define geo_decl_aligned(var) __declspec(align(GEO_MEMORY_ALIGNMENT)) var | ||
| 389 | #elif defined(GEO_COMPILER_EMSCRIPTEN) | ||
| 390 | #define geo_decl_aligned(var) var | ||
| 391 | #endif | ||
| 392 | |||
| 393 | /** | ||
| 394 | * \def geo_assume_aligned(var, alignment) | ||
| 395 | * \brief Informs the compiler that a given pointer is memory-aligned. | ||
| 396 | * \details | ||
| 397 | * It helps the compiler vectorizing loops, i.e. | ||
| 398 | * generating SSE/AVX/... code. | ||
| 399 | * \param[in] var a pointer variable in the current scope | ||
| 400 | * \param[in] alignment the memory alignment (must be a power of 2) | ||
| 401 | * \par Example | ||
| 402 | * \code | ||
| 403 | * double* p = ...; | ||
| 404 | * geo_assume_aligned(p,alignment); | ||
| 405 | * \endcode | ||
| 406 | * \note Memory alignment is not supported under Android. | ||
| 407 | * \note C++20 has std::assume_aligned() | ||
| 408 | */ | ||
| 409 | #if defined(GEO_OS_ANDROID) | ||
| 410 | #define geo_assume_aligned(var, alignment) | ||
| 411 | #elif defined(GEO_COMPILER_INTEL) | ||
| 412 | #define geo_assume_aligned(var, alignment) \ | ||
| 413 | __assume_aligned(var, alignment) | ||
| 414 | #elif defined(GEO_COMPILER_CLANG) | ||
| 415 | #define geo_assume_aligned(var, alignment) | ||
| 416 | // GCC __builtin_assume_aligned is not yet supported by clang-3.3 | ||
| 417 | #elif defined(GEO_COMPILER_GCC) | ||
| 418 | #if __GNUC__ >= 4 && __GNUC_MINOR__ >= 7 | ||
| 419 | #define geo_assume_aligned(var, alignment) \ | ||
| 420 | *(void**) (&var) = __builtin_assume_aligned(var, alignment) | ||
| 421 | // the GCC way of specifying that a pointer is aligned returns | ||
| 422 | // the aligned pointer (I can't figure out why). It needs to be | ||
| 423 | // affected otherwise it is not taken into account (verified by | ||
| 424 | // looking at the output of gcc -S) | ||
| 425 | #else | ||
| 426 | #define geo_assume_aligned(var, alignment) | ||
| 427 | #endif | ||
| 428 | #elif defined(GEO_COMPILER_MSVC) | ||
| 429 | #define geo_assume_aligned(var, alignment) | ||
| 430 | // TODO: I do not know how to do that with MSVC | ||
| 431 | #elif defined(GEO_COMPILER_EMSCRIPTEN) | ||
| 432 | #define geo_assume_aligned(var, alignment) | ||
| 433 | #elif defined(GEO_COMPILER_MINGW) | ||
| 434 | #define geo_assume_aligned(var, alignment) | ||
| 435 | #endif | ||
| 436 | |||
| 437 | /** | ||
| 438 | * \def geo_restrict | ||
| 439 | * \brief Informs the compiler that a given pointer has no aliasing | ||
| 440 | * \details | ||
| 441 | * No aliasing means that no other pointer points to the same area of | ||
| 442 | * memory. | ||
| 443 | * \code | ||
| 444 | * double* geo_restrict p = ...; | ||
| 445 | * \endcode | ||
| 446 | */ | ||
| 447 | #if defined(GEO_COMPILER_INTEL) | ||
| 448 | #define geo_restrict __restrict | ||
| 449 | #elif defined(GEO_COMPILER_GCC_FAMILY) | ||
| 450 | #define geo_restrict __restrict__ | ||
| 451 | #elif defined(GEO_COMPILER_MSVC) | ||
| 452 | #define geo_restrict __restrict | ||
| 453 | #elif defined(GEO_COMPILER_EMSCRIPTEN) | ||
| 454 | #define geo_restrict | ||
| 455 | #endif | ||
| 456 | |||
| 457 | /** | ||
| 458 | * \brief Checks whether a pointer is aligned. | ||
| 459 | * \param[in] p the pointer to check | ||
| 460 | * \param[in] alignment memory alignment (must be a power of 2) | ||
| 461 | * \retval true if \p is aligned on \p alignment bytes | ||
| 462 | * \retval false otherwise | ||
| 463 | */ | ||
| 464 | inline bool is_aligned( | ||
| 465 | void* p, size_t alignment = GEO_MEMORY_ALIGNMENT | ||
| 466 | ) { | ||
| 467 | return (reinterpret_cast<size_t>(p) & (alignment - 1)) == 0; | ||
| 468 | } | ||
| 469 | |||
| 470 | /** | ||
| 471 | * \brief Returns the smallest aligned memory address from p. | ||
| 472 | */ | ||
| 473 | inline void* align(void* p) { | ||
| 474 | size_t offset = ( | ||
| 475 | GEO_MEMORY_ALIGNMENT - | ||
| 476 | (reinterpret_cast<size_t>(p) & (GEO_MEMORY_ALIGNMENT - 1)) | ||
| 477 | ) & (GEO_MEMORY_ALIGNMENT - 1); | ||
| 478 | return reinterpret_cast<char*>(p) + offset; | ||
| 479 | } | ||
| 480 | |||
| 481 | /** | ||
| 482 | * \brief Allocates aligned memory on the stack | ||
| 483 | * \brief Allocates \p size bytes on the stack. The returned address | ||
| 484 | * is guaranteed to be aligned on \c GEO_MEMORY_ALIGNMENT bytes. To | ||
| 485 | * guarantee the memory alignment, the function may allocate more than | ||
| 486 | * \p size, but not more than <tt>GEO_MEMORY_ALIGNMENT - 1</tt>. | ||
| 487 | * \param[in] size Number of bytes to allocate. | ||
| 488 | * \return An aligned pointer to a memory block of \p size bytes. | ||
| 489 | */ | ||
| 490 | #define geo_aligned_alloca(size) \ | ||
| 491 | GEO::Memory::align(alloca(size + GEO_MEMORY_ALIGNMENT - 1)) | ||
| 492 | |||
| 493 | /** | ||
| 494 | * \brief An allocator that performs aligned memory allocations | ||
| 495 | * \details | ||
| 496 | * The allocator can be used as a template argument for STL | ||
| 497 | * containers. It is required for efficient vectorization of the code | ||
| 498 | * using vector processing units (SSE,AVX or AVX-512). | ||
| 499 | */ | ||
| 500 | template <class T, int ALIGN = GEO_MEMORY_ALIGNMENT> | ||
| 501 | class aligned_allocator { | ||
| 502 | public: | ||
| 503 | /** \brief Element type */ | ||
| 504 | typedef T value_type; | ||
| 505 | |||
| 506 | /** \brief Pointer to element */ | ||
| 507 | typedef T* pointer; | ||
| 508 | |||
| 509 | /** \brief Reference to element */ | ||
| 510 | typedef T& reference; | ||
| 511 | |||
| 512 | /** \brief Pointer to constant element */ | ||
| 513 | typedef const T* const_pointer; | ||
| 514 | |||
| 515 | /** \brief Reference to constant element */ | ||
| 516 | typedef const T& const_reference; | ||
| 517 | |||
| 518 | /** \brief Quantities of elements */ | ||
| 519 | typedef ::std::size_t size_type; | ||
| 520 | |||
| 521 | /** \brief Difference between two pointers */ | ||
| 522 | typedef ::std::ptrdiff_t difference_type; | ||
| 523 | |||
| 524 | /** \brief Alignment in bytes */ | ||
| 525 | static constexpr int ALIGNMENT = ALIGN; | ||
| 526 | |||
| 527 | /** | ||
| 528 | * \brief Defines the same allocator for other types | ||
| 529 | * \tparam U type of the elements to allocate | ||
| 530 | */ | ||
| 531 | template <class U> | ||
| 532 | struct rebind { | ||
| 533 | /**Equivalent allocator type to allocate elements of type \p U*/ | ||
| 534 | typedef aligned_allocator<U,ALIGN> other; | ||
| 535 | }; | ||
| 536 | |||
| 537 | /* \brief default constructor */ | ||
| 538 | constexpr aligned_allocator() noexcept = default; | ||
| 539 | |||
| 540 | /* \brief conversion copy constructor */ | ||
| 541 | template <class U, int A2> constexpr aligned_allocator( | ||
| 542 | const aligned_allocator<U, A2>& | ||
| 543 | ) noexcept { | ||
| 544 | } | ||
| 545 | |||
| 546 | /** | ||
| 547 | * \brief Gets the address of an object | ||
| 548 | * \param[in] x a reference to an object of type T | ||
| 549 | * \return a pointer to \p x | ||
| 550 | */ | ||
| 551 | pointer address(reference x) { | ||
| 552 | return &x; | ||
| 553 | } | ||
| 554 | |||
| 555 | /** | ||
| 556 | * \brief Gets the address of a object | ||
| 557 | * \param[in] x a const reference to an object of type T | ||
| 558 | * \return a const_pointer to \p x | ||
| 559 | */ | ||
| 560 | const_pointer address(const_reference x) { | ||
| 561 | return &x; | ||
| 562 | } | ||
| 563 | |||
| 564 | /** | ||
| 565 | * \brief Allocates a block of storage | ||
| 566 | * \details Attempts to allocate a block of storage with a size | ||
| 567 | * large enough to contain \p n elements of member type | ||
| 568 | * \c value_type (an alias of the allocator's template parameter), | ||
| 569 | * and returns a pointer to the first element. | ||
| 570 | * The storage is aligned on ALIGN bytes, but they are \b not | ||
| 571 | * constructed. | ||
| 572 | * \param[in] nb_elt number of elements to allocate | ||
| 573 | * \param[in] hint Either 0 or a value previously | ||
| 574 | * obtained by another call to allocate and not yet freed with | ||
| 575 | * deallocate. When it is not 0, this value may be used as a hint | ||
| 576 | * to improve performance by allocating the new block near the one | ||
| 577 | * specified. The address of an adjacent element is often a good | ||
| 578 | * choice. | ||
| 579 | * \return A pointer to the initial element in the block of storage | ||
| 580 | */ | ||
| 581 | 301090 | pointer allocate( | |
| 582 | size_type nb_elt, const void* hint = nullptr | ||
| 583 | ) { | ||
| 584 | nb_elt = std::max(nb_elt,size_type(1)); | ||
| 585 | geo_argused(hint); | ||
| 586 | ✗ | while(true) { | |
| 587 | pointer result = static_cast<pointer>( | ||
| 588 | 292328 | aligned_malloc(sizeof(T) * nb_elt, ALIGNMENT) | |
| 589 | ); | ||
| 590 |
1/2✓ Branch 0 taken 150967 times.
✗ Branch 1 not taken.
|
301090 | if(result != nullptr) { |
| 591 | 301090 | return result; | |
| 592 | } | ||
| 593 | // under Linux, a process requesting more mem than available | ||
| 594 | // is killed (and there is nothing we can capture). Under | ||
| 595 | // other OSes, the standard mechanism to let the runtime | ||
| 596 | // know is as follows: | ||
| 597 | // see: https://stackoverflow.com/questions/7194127/ | ||
| 598 | // how-should-i-write-iso-c-standard-conformant-custom- | ||
| 599 | // new-and-delete-operators | ||
| 600 | // (if there is a handler, call it repeatedly until | ||
| 601 | // allocation succeeds, else throw a bad_alloc exception) | ||
| 602 | ✗ | std::new_handler handler = std::get_new_handler(); | |
| 603 | ✗ | if(handler != nullptr) { | |
| 604 | ✗ | (*handler)(); | |
| 605 | } else { | ||
| 606 | ✗ | throw std::bad_alloc(); | |
| 607 | } | ||
| 608 | } | ||
| 609 | } | ||
| 610 | |||
| 611 | /** | ||
| 612 | * \brief Releases a block of storage | ||
| 613 | * \details Releases a block of storage previously allocated with | ||
| 614 | * member allocate()) and not yet released. The elements in the | ||
| 615 | * array \b are not destroyed by a call to this member function. | ||
| 616 | * \param[in] p Pointer to a block of storage previously allocated | ||
| 617 | * with aligned_allocator::allocate. | ||
| 618 | * \param[in] nb_elt Number of elements allocated on the call to | ||
| 619 | * aligned_allocator::allocate() for this block of storage. | ||
| 620 | * \see allocate() | ||
| 621 | */ | ||
| 622 | void deallocate(pointer p, size_type nb_elt) { | ||
| 623 | geo_argused(nb_elt); | ||
| 624 | aligned_free(p); | ||
| 625 | } | ||
| 626 | |||
| 627 | /** | ||
| 628 | * \brief Gets the maximum size possible to allocate | ||
| 629 | * \return the maximum number of elements, each of member type | ||
| 630 | * \c value_type that could potentially be allocated by a call to | ||
| 631 | * member allocate(). | ||
| 632 | */ | ||
| 633 | size_type max_size() const { | ||
| 634 | ::std::allocator<char> a; | ||
| 635 | return std::allocator_traits<decltype(a)>::max_size(a) / | ||
| 636 | sizeof(T); | ||
| 637 | } | ||
| 638 | |||
| 639 | /** | ||
| 640 | * \brief Constructs an object | ||
| 641 | * \details Constructs an element object on the location pointed | ||
| 642 | * by \p p. | ||
| 643 | * Notice that this does not allocate space for the element. It | ||
| 644 | * should already be available at p (see member allocate() to | ||
| 645 | * allocate space). | ||
| 646 | * \param[in] p pointer to a location with enough storage space to | ||
| 647 | * contain an element of type value_type. | ||
| 648 | * \param[in] val value to initialize the constructed element to. | ||
| 649 | * \see allocate() | ||
| 650 | */ | ||
| 651 | void construct(pointer p, const_reference val) { | ||
| 652 |
2/4✗ Branch 1 not taken.
✓ Branch 2 taken 1426 times.
✓ Branch 4 taken 1358 times.
✗ Branch 5 not taken.
|
220506993 | new (static_cast<void*>(p))value_type(val); |
| 653 | } | ||
| 654 | |||
| 655 | /** | ||
| 656 | * \brief Destroys an object | ||
| 657 | * \details Destroys in-place the object pointed by p. Notice that | ||
| 658 | * this does not deallocate the storage for the element (see | ||
| 659 | * member deallocate() to release storage space). | ||
| 660 | * \param[in] p pointer to the object to be destroyed. | ||
| 661 | * \see deallocate() | ||
| 662 | */ | ||
| 663 | void destroy(pointer p) { | ||
| 664 | geo_argused(p); // else MSVC complains | ||
| 665 | 323499 | p->~value_type(); | |
| 666 | } | ||
| 667 | }; | ||
| 668 | |||
| 669 | /** | ||
| 670 | * \brief Tests whether two aligned_allocator%s are equal. | ||
| 671 | * \return Always true. | ||
| 672 | */ | ||
| 673 | template <typename T1, int A1, typename T2, int A2> | ||
| 674 | inline bool operator== ( | ||
| 675 | const aligned_allocator<T1, A1>&, const aligned_allocator<T2, A2>& | ||
| 676 | ) { | ||
| 677 | return true; | ||
| 678 | } | ||
| 679 | |||
| 680 | /** | ||
| 681 | * \brief Tests whether two aligned_allocator%s are different. | ||
| 682 | * \return Always false. | ||
| 683 | */ | ||
| 684 | template <typename T1, int A1, typename T2, int A2> | ||
| 685 | inline bool operator!= ( | ||
| 686 | const aligned_allocator<T1, A1>&, const aligned_allocator<T2, A2>& | ||
| 687 | ) { | ||
| 688 | return false; | ||
| 689 | } | ||
| 690 | } | ||
| 691 | |||
| 692 | /************************************************************************/ | ||
| 693 | |||
| 694 | /** | ||
| 695 | * \brief Vector with aligned memory allocation | ||
| 696 | * \details | ||
| 697 | * Class vector is a \c std::vector that uses a memory-aligned allocator | ||
| 698 | * Memory-aligned allocation makes it well suited for SSE/AVX/... vector | ||
| 699 | * code generation. | ||
| 700 | * \see Memory::aligned_allocator | ||
| 701 | */ | ||
| 702 | template <class T> | ||
| 703 |
40/125✓ Branch 0 taken 364 times.
✓ Branch 1 taken 5748 times.
✓ Branch 2 taken 109 times.
✓ Branch 3 taken 748 times.
✓ Branch 4 taken 231 times.
✓ Branch 5 taken 467 times.
✓ Branch 6 taken 174 times.
✓ Branch 7 taken 1221 times.
✓ Branch 8 taken 114 times.
✓ Branch 9 taken 628 times.
✓ Branch 10 taken 148 times.
✓ Branch 11 taken 200 times.
✓ Branch 12 taken 42 times.
✓ Branch 13 taken 140 times.
✓ Branch 14 taken 140 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 33 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 209 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 30 times.
✓ Branch 21 taken 314 times.
✓ Branch 22 taken 188 times.
✓ Branch 23 taken 60 times.
✓ Branch 24 taken 246 times.
✓ Branch 25 taken 2 times.
✓ Branch 26 taken 718 times.
✓ Branch 27 taken 127 times.
✓ Branch 28 taken 185 times.
✓ Branch 29 taken 596 times.
✓ Branch 30 taken 164 times.
✓ Branch 31 taken 27 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 27 times.
✗ Branch 34 not taken.
✓ Branch 35 taken 27 times.
✗ Branch 36 not taken.
✓ Branch 40 taken 60 times.
✗ Branch 41 not taken.
✗ Branch 172 not taken.
✗ Branch 173 not taken.
✗ Branch 174 not taken.
✗ Branch 175 not taken.
✗ Branch 176 not taken.
✗ Branch 177 not taken.
✗ Branch 178 not taken.
✗ Branch 179 not taken.
✗ Branch 180 not taken.
✗ Branch 181 not taken.
✗ Branch 184 not taken.
✗ Branch 185 not taken.
✓ Branch 187 taken 3 times.
✗ Branch 188 not taken.
✗ Branch 189 not taken.
✗ Branch 190 not taken.
✗ Branch 191 not taken.
✗ Branch 192 not taken.
✗ Branch 193 not taken.
✗ Branch 194 not taken.
✗ Branch 195 not taken.
✗ Branch 196 not taken.
✗ Branch 199 not taken.
✓ Branch 200 taken 51 times.
✓ Branch 202 taken 1 times.
✗ Branch 203 not taken.
✗ Branch 204 not taken.
✗ Branch 205 not taken.
✗ Branch 206 not taken.
✗ Branch 207 not taken.
✗ Branch 208 not taken.
✗ Branch 209 not taken.
✗ Branch 210 not taken.
✗ Branch 211 not taken.
✗ Branch 214 not taken.
✓ Branch 215 taken 5 times.
✓ Branch 217 taken 5 times.
✗ Branch 218 not taken.
✗ Branch 219 not taken.
✗ Branch 220 not taken.
✗ Branch 221 not taken.
✗ Branch 222 not taken.
✗ Branch 223 not taken.
✗ Branch 224 not taken.
✗ Branch 225 not taken.
✗ Branch 226 not taken.
✗ Branch 229 not taken.
✓ Branch 230 taken 25 times.
✓ Branch 232 taken 1 times.
✗ Branch 233 not taken.
✗ Branch 234 not taken.
✗ Branch 235 not taken.
✗ Branch 236 not taken.
✗ Branch 237 not taken.
✗ Branch 238 not taken.
✗ Branch 239 not taken.
✗ Branch 240 not taken.
✗ Branch 241 not taken.
✗ Branch 244 not taken.
✓ Branch 245 taken 5 times.
✗ Branch 247 not taken.
✗ Branch 248 not taken.
✗ Branch 249 not taken.
✗ Branch 250 not taken.
✗ Branch 251 not taken.
✗ Branch 252 not taken.
✗ Branch 253 not taken.
✗ Branch 254 not taken.
✗ Branch 255 not taken.
✗ Branch 256 not taken.
✗ Branch 259 not taken.
✗ Branch 260 not taken.
✗ Branch 262 not taken.
✗ Branch 263 not taken.
✗ Branch 264 not taken.
✗ Branch 265 not taken.
✗ Branch 266 not taken.
✗ Branch 267 not taken.
✗ Branch 268 not taken.
✗ Branch 269 not taken.
✗ Branch 270 not taken.
✗ Branch 271 not taken.
✗ Branch 274 not taken.
✗ Branch 275 not taken.
✗ Branch 285 not taken.
✗ Branch 286 not taken.
|
40091 | class vector : public ::std::vector<T, Memory::aligned_allocator<T> > { |
| 704 | /** | ||
| 705 | * \brief Shortcut to the allocator type. | ||
| 706 | */ | ||
| 707 | typedef Memory::aligned_allocator<T> allocator; | ||
| 708 | |||
| 709 | /** | ||
| 710 | * \brief Shortcut to the base class type | ||
| 711 | */ | ||
| 712 | typedef ::std::vector<T, Memory::aligned_allocator<T> > baseclass; | ||
| 713 | |||
| 714 | |||
| 715 | |||
| 716 | public: | ||
| 717 | /** | ||
| 718 | * \brief Creates an empty vector | ||
| 719 | */ | ||
| 720 | vector() : | ||
| 721 | baseclass() { | ||
| 722 | 3 | } | |
| 723 | |||
| 724 | /** | ||
| 725 | * \brief Creates a pre-allocated vector | ||
| 726 | * \details Constructs a container with \p size elements. | ||
| 727 | * Each element is default-constructed. | ||
| 728 | * \param[in] size Number of elements to allocate | ||
| 729 | */ | ||
| 730 |
0/8✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
2603 | explicit vector(index_t size) : |
| 731 |
18/54✓ Branch 1 taken 687 times.
✓ Branch 2 taken 427 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 173 times.
✓ Branch 5 taken 262 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 32 times.
✓ Branch 8 taken 246 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 32 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 63 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✓ Branch 16 taken 58 times.
✓ Branch 17 taken 112 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 8 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 60 times.
✓ Branch 22 taken 26 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 60 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✓ Branch 36 taken 16 times.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✓ Branch 39 taken 59 times.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✓ Branch 42 taken 166 times.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 166 times.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
|
2388 | baseclass(size) { |
| 732 | ✗ | } | |
| 733 | |||
| 734 | /** | ||
| 735 | * \brief Creates a pre-initialized vector | ||
| 736 | * \details Constructs a container with \p size elements. | ||
| 737 | * Each element is a copy of \p val. | ||
| 738 | * \param[in] size Number of elements to allocate | ||
| 739 | * \param[in] val Initial value of the elements | ||
| 740 | */ | ||
| 741 |
3/6✓ Branch 1 taken 75 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 251 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 723 times.
✗ Branch 8 not taken.
|
2692 | explicit vector(index_t size, const T& val) : |
| 742 |
43/939✓ Branch 1 taken 295 times.
✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 96 times.
✓ Branch 5 taken 6 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 69 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 199 times.
✓ Branch 10 taken 30 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 913 times.
✓ Branch 13 taken 30 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 718 times.
✓ Branch 16 taken 30 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 30 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 30 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 9 times.
✓ Branch 25 taken 26 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 5 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 27 times.
✓ Branch 31 taken 5 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 27 times.
✓ Branch 34 taken 17 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 27 times.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✓ Branch 39 taken 27 times.
✗ Branch 40 not taken.
✓ Branch 42 taken 60 times.
✗ Branch 43 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 62 not taken.
✗ Branch 63 not taken.
✗ Branch 65 not taken.
✗ Branch 66 not taken.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✗ Branch 72 not taken.
✗ Branch 73 not taken.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✗ Branch 78 not taken.
✗ Branch 79 not taken.
✗ Branch 82 not taken.
✗ Branch 83 not taken.
✗ Branch 85 not taken.
✗ Branch 86 not taken.
✗ Branch 88 not taken.
✗ Branch 89 not taken.
✗ Branch 92 not taken.
✗ Branch 93 not taken.
✗ Branch 95 not taken.
✗ Branch 96 not taken.
✗ Branch 98 not taken.
✗ Branch 99 not taken.
✗ Branch 102 not taken.
✗ Branch 103 not taken.
✗ Branch 105 not taken.
✗ Branch 106 not taken.
✗ Branch 108 not taken.
✗ Branch 109 not taken.
✗ Branch 112 not taken.
✗ Branch 113 not taken.
✗ Branch 115 not taken.
✗ Branch 116 not taken.
✗ Branch 118 not taken.
✗ Branch 119 not taken.
✗ Branch 122 not taken.
✗ Branch 123 not taken.
✗ Branch 125 not taken.
✗ Branch 126 not taken.
✗ Branch 128 not taken.
✗ Branch 129 not taken.
✗ Branch 132 not taken.
✗ Branch 133 not taken.
✗ Branch 135 not taken.
✗ Branch 136 not taken.
✗ Branch 138 not taken.
✗ Branch 139 not taken.
✗ Branch 142 not taken.
✗ Branch 143 not taken.
✗ Branch 145 not taken.
✗ Branch 146 not taken.
✗ Branch 148 not taken.
✗ Branch 149 not taken.
✗ Branch 152 not taken.
✗ Branch 153 not taken.
✗ Branch 155 not taken.
✗ Branch 156 not taken.
✗ Branch 158 not taken.
✗ Branch 159 not taken.
✗ Branch 162 not taken.
✗ Branch 163 not taken.
✗ Branch 165 not taken.
✗ Branch 166 not taken.
✗ Branch 168 not taken.
✗ Branch 169 not taken.
✗ Branch 172 not taken.
✗ Branch 173 not taken.
✗ Branch 175 not taken.
✗ Branch 176 not taken.
✗ Branch 178 not taken.
✗ Branch 179 not taken.
✗ Branch 182 not taken.
✗ Branch 183 not taken.
✗ Branch 185 not taken.
✗ Branch 186 not taken.
✗ Branch 188 not taken.
✗ Branch 189 not taken.
✗ Branch 192 not taken.
✗ Branch 193 not taken.
✗ Branch 195 not taken.
✗ Branch 196 not taken.
✗ Branch 198 not taken.
✗ Branch 199 not taken.
✗ Branch 202 not taken.
✗ Branch 203 not taken.
✗ Branch 205 not taken.
✗ Branch 206 not taken.
✗ Branch 208 not taken.
✗ Branch 209 not taken.
✗ Branch 212 not taken.
✗ Branch 213 not taken.
✗ Branch 215 not taken.
✗ Branch 216 not taken.
✗ Branch 218 not taken.
✗ Branch 219 not taken.
✗ Branch 222 not taken.
✗ Branch 223 not taken.
✗ Branch 225 not taken.
✗ Branch 226 not taken.
✗ Branch 228 not taken.
✗ Branch 229 not taken.
✗ Branch 232 not taken.
✗ Branch 233 not taken.
✓ Branch 235 taken 1 times.
✗ Branch 236 not taken.
✓ Branch 238 taken 1 times.
✗ Branch 239 not taken.
✓ Branch 242 taken 36 times.
✗ Branch 243 not taken.
✗ Branch 245 not taken.
✗ Branch 246 not taken.
✗ Branch 248 not taken.
✗ Branch 249 not taken.
✗ Branch 252 not taken.
✗ Branch 253 not taken.
✗ Branch 255 not taken.
✗ Branch 256 not taken.
✗ Branch 258 not taken.
✗ Branch 259 not taken.
✗ Branch 262 not taken.
✗ Branch 263 not taken.
✗ Branch 265 not taken.
✗ Branch 266 not taken.
✗ Branch 268 not taken.
✗ Branch 269 not taken.
✗ Branch 272 not taken.
✗ Branch 273 not taken.
✗ Branch 275 not taken.
✗ Branch 276 not taken.
✗ Branch 278 not taken.
✗ Branch 279 not taken.
✗ Branch 282 not taken.
✗ Branch 283 not taken.
✓ Branch 285 taken 2 times.
✗ Branch 286 not taken.
✓ Branch 288 taken 2 times.
✗ Branch 289 not taken.
✗ Branch 292 not taken.
✗ Branch 293 not taken.
✗ Branch 295 not taken.
✗ Branch 296 not taken.
✗ Branch 298 not taken.
✗ Branch 299 not taken.
✗ Branch 302 not taken.
✗ Branch 303 not taken.
✗ Branch 305 not taken.
✗ Branch 306 not taken.
✗ Branch 308 not taken.
✗ Branch 309 not taken.
✗ Branch 312 not taken.
✗ Branch 313 not taken.
✗ Branch 315 not taken.
✗ Branch 316 not taken.
✗ Branch 318 not taken.
✗ Branch 319 not taken.
✗ Branch 322 not taken.
✗ Branch 323 not taken.
✗ Branch 325 not taken.
✗ Branch 326 not taken.
✗ Branch 328 not taken.
✗ Branch 329 not taken.
✗ Branch 332 not taken.
✗ Branch 333 not taken.
✗ Branch 335 not taken.
✗ Branch 336 not taken.
✗ Branch 338 not taken.
✗ Branch 339 not taken.
✗ Branch 342 not taken.
✗ Branch 343 not taken.
✗ Branch 345 not taken.
✗ Branch 346 not taken.
✗ Branch 348 not taken.
✗ Branch 349 not taken.
✗ Branch 352 not taken.
✗ Branch 353 not taken.
✗ Branch 355 not taken.
✗ Branch 356 not taken.
✗ Branch 358 not taken.
✗ Branch 359 not taken.
✗ Branch 362 not taken.
✗ Branch 363 not taken.
✗ Branch 365 not taken.
✗ Branch 366 not taken.
✗ Branch 368 not taken.
✗ Branch 369 not taken.
✗ Branch 372 not taken.
✗ Branch 373 not taken.
✗ Branch 375 not taken.
✗ Branch 376 not taken.
✗ Branch 378 not taken.
✗ Branch 379 not taken.
✗ Branch 382 not taken.
✗ Branch 383 not taken.
✗ Branch 385 not taken.
✗ Branch 386 not taken.
✗ Branch 388 not taken.
✗ Branch 389 not taken.
✓ Branch 392 taken 160 times.
✗ Branch 393 not taken.
✗ Branch 395 not taken.
✗ Branch 396 not taken.
✗ Branch 398 not taken.
✗ Branch 399 not taken.
✗ Branch 402 not taken.
✗ Branch 403 not taken.
✗ Branch 405 not taken.
✗ Branch 406 not taken.
✗ Branch 408 not taken.
✗ Branch 409 not taken.
✗ Branch 412 not taken.
✗ Branch 413 not taken.
✗ Branch 415 not taken.
✗ Branch 416 not taken.
✗ Branch 418 not taken.
✗ Branch 419 not taken.
✓ Branch 422 taken 320 times.
✗ Branch 423 not taken.
✗ Branch 425 not taken.
✗ Branch 426 not taken.
✗ Branch 428 not taken.
✗ Branch 429 not taken.
✗ Branch 432 not taken.
✗ Branch 433 not taken.
✗ Branch 435 not taken.
✗ Branch 436 not taken.
✗ Branch 438 not taken.
✗ Branch 439 not taken.
✗ Branch 442 not taken.
✗ Branch 443 not taken.
✗ Branch 445 not taken.
✗ Branch 446 not taken.
✗ Branch 448 not taken.
✗ Branch 449 not taken.
✗ Branch 452 not taken.
✗ Branch 453 not taken.
✓ Branch 455 taken 1 times.
✗ Branch 456 not taken.
✓ Branch 458 taken 1 times.
✗ Branch 459 not taken.
✗ Branch 462 not taken.
✗ Branch 463 not taken.
✗ Branch 465 not taken.
✗ Branch 466 not taken.
✗ Branch 468 not taken.
✗ Branch 469 not taken.
✗ Branch 472 not taken.
✗ Branch 473 not taken.
✗ Branch 475 not taken.
✗ Branch 476 not taken.
✗ Branch 478 not taken.
✗ Branch 479 not taken.
✗ Branch 482 not taken.
✗ Branch 483 not taken.
✗ Branch 485 not taken.
✗ Branch 486 not taken.
✗ Branch 488 not taken.
✗ Branch 489 not taken.
✗ Branch 492 not taken.
✗ Branch 493 not taken.
✗ Branch 495 not taken.
✗ Branch 496 not taken.
✗ Branch 498 not taken.
✗ Branch 499 not taken.
✗ Branch 502 not taken.
✗ Branch 503 not taken.
✗ Branch 505 not taken.
✗ Branch 506 not taken.
✗ Branch 508 not taken.
✗ Branch 509 not taken.
✗ Branch 512 not taken.
✗ Branch 513 not taken.
✗ Branch 515 not taken.
✗ Branch 516 not taken.
✗ Branch 518 not taken.
✗ Branch 519 not taken.
✗ Branch 522 not taken.
✗ Branch 523 not taken.
✗ Branch 525 not taken.
✗ Branch 526 not taken.
✗ Branch 528 not taken.
✗ Branch 529 not taken.
✗ Branch 532 not taken.
✗ Branch 533 not taken.
✗ Branch 535 not taken.
✗ Branch 536 not taken.
✗ Branch 538 not taken.
✗ Branch 539 not taken.
✗ Branch 542 not taken.
✗ Branch 543 not taken.
✗ Branch 545 not taken.
✗ Branch 546 not taken.
✗ Branch 548 not taken.
✗ Branch 549 not taken.
✗ Branch 552 not taken.
✗ Branch 553 not taken.
✗ Branch 555 not taken.
✗ Branch 556 not taken.
✗ Branch 558 not taken.
✗ Branch 559 not taken.
✗ Branch 562 not taken.
✗ Branch 563 not taken.
✗ Branch 565 not taken.
✗ Branch 566 not taken.
✗ Branch 568 not taken.
✗ Branch 569 not taken.
✗ Branch 572 not taken.
✗ Branch 573 not taken.
✗ Branch 575 not taken.
✗ Branch 576 not taken.
✗ Branch 578 not taken.
✗ Branch 579 not taken.
✗ Branch 582 not taken.
✗ Branch 583 not taken.
✗ Branch 585 not taken.
✗ Branch 586 not taken.
✗ Branch 588 not taken.
✗ Branch 589 not taken.
✗ Branch 592 not taken.
✗ Branch 593 not taken.
✗ Branch 595 not taken.
✗ Branch 596 not taken.
✗ Branch 598 not taken.
✗ Branch 599 not taken.
✗ Branch 602 not taken.
✗ Branch 603 not taken.
✗ Branch 605 not taken.
✗ Branch 606 not taken.
✗ Branch 608 not taken.
✗ Branch 609 not taken.
✓ Branch 612 taken 160 times.
✗ Branch 613 not taken.
✗ Branch 615 not taken.
✗ Branch 616 not taken.
✗ Branch 618 not taken.
✗ Branch 619 not taken.
✗ Branch 622 not taken.
✗ Branch 623 not taken.
✗ Branch 625 not taken.
✗ Branch 626 not taken.
✗ Branch 628 not taken.
✗ Branch 629 not taken.
✗ Branch 632 not taken.
✗ Branch 633 not taken.
✗ Branch 635 not taken.
✗ Branch 636 not taken.
✗ Branch 638 not taken.
✗ Branch 639 not taken.
✗ Branch 642 not taken.
✗ Branch 643 not taken.
✗ Branch 645 not taken.
✗ Branch 646 not taken.
✗ Branch 648 not taken.
✗ Branch 649 not taken.
✗ Branch 652 not taken.
✗ Branch 653 not taken.
✗ Branch 655 not taken.
✗ Branch 656 not taken.
✗ Branch 658 not taken.
✗ Branch 659 not taken.
✗ Branch 662 not taken.
✗ Branch 663 not taken.
✗ Branch 665 not taken.
✗ Branch 666 not taken.
✗ Branch 668 not taken.
✗ Branch 669 not taken.
✗ Branch 672 not taken.
✗ Branch 673 not taken.
✓ Branch 675 taken 1 times.
✗ Branch 676 not taken.
✓ Branch 678 taken 1 times.
✗ Branch 679 not taken.
✗ Branch 682 not taken.
✗ Branch 683 not taken.
✗ Branch 685 not taken.
✗ Branch 686 not taken.
✗ Branch 688 not taken.
✗ Branch 689 not taken.
✗ Branch 692 not taken.
✗ Branch 693 not taken.
✗ Branch 695 not taken.
✗ Branch 696 not taken.
✗ Branch 698 not taken.
✗ Branch 699 not taken.
✗ Branch 702 not taken.
✗ Branch 703 not taken.
✗ Branch 705 not taken.
✗ Branch 706 not taken.
✗ Branch 708 not taken.
✗ Branch 709 not taken.
✗ Branch 712 not taken.
✗ Branch 713 not taken.
✗ Branch 715 not taken.
✗ Branch 716 not taken.
✗ Branch 718 not taken.
✗ Branch 719 not taken.
✗ Branch 722 not taken.
✗ Branch 723 not taken.
✓ Branch 725 taken 4 times.
✗ Branch 726 not taken.
✓ Branch 728 taken 4 times.
✗ Branch 729 not taken.
✗ Branch 732 not taken.
✗ Branch 733 not taken.
✗ Branch 735 not taken.
✗ Branch 736 not taken.
✗ Branch 738 not taken.
✗ Branch 739 not taken.
✗ Branch 742 not taken.
✗ Branch 743 not taken.
✗ Branch 745 not taken.
✗ Branch 746 not taken.
✗ Branch 748 not taken.
✗ Branch 749 not taken.
✗ Branch 752 not taken.
✗ Branch 753 not taken.
✗ Branch 755 not taken.
✗ Branch 756 not taken.
✗ Branch 758 not taken.
✗ Branch 759 not taken.
✗ Branch 762 not taken.
✗ Branch 763 not taken.
✗ Branch 765 not taken.
✗ Branch 766 not taken.
✗ Branch 768 not taken.
✗ Branch 769 not taken.
✗ Branch 772 not taken.
✗ Branch 773 not taken.
✗ Branch 775 not taken.
✗ Branch 776 not taken.
✗ Branch 778 not taken.
✗ Branch 779 not taken.
✗ Branch 782 not taken.
✗ Branch 783 not taken.
✗ Branch 785 not taken.
✗ Branch 786 not taken.
✗ Branch 788 not taken.
✗ Branch 789 not taken.
✗ Branch 792 not taken.
✗ Branch 793 not taken.
✗ Branch 795 not taken.
✗ Branch 796 not taken.
✗ Branch 798 not taken.
✗ Branch 799 not taken.
✗ Branch 802 not taken.
✗ Branch 803 not taken.
✗ Branch 805 not taken.
✗ Branch 806 not taken.
✗ Branch 808 not taken.
✗ Branch 809 not taken.
✗ Branch 812 not taken.
✗ Branch 813 not taken.
✗ Branch 815 not taken.
✗ Branch 816 not taken.
✗ Branch 818 not taken.
✗ Branch 819 not taken.
✗ Branch 822 not taken.
✗ Branch 823 not taken.
✗ Branch 825 not taken.
✗ Branch 826 not taken.
✗ Branch 828 not taken.
✗ Branch 829 not taken.
✓ Branch 832 taken 160 times.
✗ Branch 833 not taken.
✗ Branch 835 not taken.
✗ Branch 836 not taken.
✗ Branch 838 not taken.
✗ Branch 839 not taken.
✗ Branch 842 not taken.
✗ Branch 843 not taken.
✗ Branch 845 not taken.
✗ Branch 846 not taken.
✗ Branch 848 not taken.
✗ Branch 849 not taken.
✗ Branch 852 not taken.
✗ Branch 853 not taken.
✗ Branch 855 not taken.
✗ Branch 856 not taken.
✗ Branch 858 not taken.
✗ Branch 859 not taken.
✓ Branch 862 taken 640 times.
✗ Branch 863 not taken.
✗ Branch 865 not taken.
✗ Branch 866 not taken.
✗ Branch 868 not taken.
✗ Branch 869 not taken.
✗ Branch 872 not taken.
✗ Branch 873 not taken.
✗ Branch 875 not taken.
✗ Branch 876 not taken.
✗ Branch 878 not taken.
✗ Branch 879 not taken.
✗ Branch 882 not taken.
✗ Branch 883 not taken.
✗ Branch 885 not taken.
✗ Branch 886 not taken.
✗ Branch 888 not taken.
✗ Branch 889 not taken.
✗ Branch 892 not taken.
✗ Branch 893 not taken.
✓ Branch 895 taken 1 times.
✗ Branch 896 not taken.
✓ Branch 898 taken 1 times.
✗ Branch 899 not taken.
✗ Branch 902 not taken.
✗ Branch 903 not taken.
✗ Branch 905 not taken.
✗ Branch 906 not taken.
✗ Branch 908 not taken.
✗ Branch 909 not taken.
✗ Branch 912 not taken.
✗ Branch 913 not taken.
✗ Branch 915 not taken.
✗ Branch 916 not taken.
✗ Branch 918 not taken.
✗ Branch 919 not taken.
✗ Branch 922 not taken.
✗ Branch 923 not taken.
✗ Branch 925 not taken.
✗ Branch 926 not taken.
✗ Branch 928 not taken.
✗ Branch 929 not taken.
✗ Branch 932 not taken.
✗ Branch 933 not taken.
✗ Branch 935 not taken.
✗ Branch 936 not taken.
✗ Branch 938 not taken.
✗ Branch 939 not taken.
✗ Branch 942 not taken.
✗ Branch 943 not taken.
✗ Branch 945 not taken.
✗ Branch 946 not taken.
✗ Branch 948 not taken.
✗ Branch 949 not taken.
✗ Branch 952 not taken.
✗ Branch 953 not taken.
✗ Branch 955 not taken.
✗ Branch 956 not taken.
✗ Branch 958 not taken.
✗ Branch 959 not taken.
✗ Branch 962 not taken.
✗ Branch 963 not taken.
✗ Branch 965 not taken.
✗ Branch 966 not taken.
✗ Branch 968 not taken.
✗ Branch 969 not taken.
✗ Branch 972 not taken.
✗ Branch 973 not taken.
✗ Branch 975 not taken.
✗ Branch 976 not taken.
✗ Branch 978 not taken.
✗ Branch 979 not taken.
✗ Branch 982 not taken.
✗ Branch 983 not taken.
✗ Branch 985 not taken.
✗ Branch 986 not taken.
✗ Branch 988 not taken.
✗ Branch 989 not taken.
✗ Branch 992 not taken.
✗ Branch 993 not taken.
✗ Branch 995 not taken.
✗ Branch 996 not taken.
✗ Branch 998 not taken.
✗ Branch 999 not taken.
✗ Branch 1002 not taken.
✗ Branch 1003 not taken.
✗ Branch 1005 not taken.
✗ Branch 1006 not taken.
✗ Branch 1008 not taken.
✗ Branch 1009 not taken.
✗ Branch 1012 not taken.
✗ Branch 1013 not taken.
✗ Branch 1015 not taken.
✗ Branch 1016 not taken.
✗ Branch 1018 not taken.
✗ Branch 1019 not taken.
✗ Branch 1022 not taken.
✗ Branch 1023 not taken.
✗ Branch 1025 not taken.
✗ Branch 1026 not taken.
✗ Branch 1028 not taken.
✗ Branch 1029 not taken.
✗ Branch 1032 not taken.
✗ Branch 1033 not taken.
✗ Branch 1035 not taken.
✗ Branch 1036 not taken.
✗ Branch 1038 not taken.
✗ Branch 1039 not taken.
✗ Branch 1042 not taken.
✗ Branch 1043 not taken.
✗ Branch 1045 not taken.
✗ Branch 1046 not taken.
✗ Branch 1048 not taken.
✗ Branch 1049 not taken.
✓ Branch 1052 taken 160 times.
✗ Branch 1053 not taken.
✗ Branch 1055 not taken.
✗ Branch 1056 not taken.
✗ Branch 1058 not taken.
✗ Branch 1059 not taken.
✗ Branch 1062 not taken.
✗ Branch 1063 not taken.
✗ Branch 1065 not taken.
✗ Branch 1066 not taken.
✗ Branch 1068 not taken.
✗ Branch 1069 not taken.
✗ Branch 1072 not taken.
✗ Branch 1073 not taken.
✗ Branch 1075 not taken.
✗ Branch 1076 not taken.
✗ Branch 1078 not taken.
✗ Branch 1079 not taken.
✗ Branch 1082 not taken.
✗ Branch 1083 not taken.
✗ Branch 1085 not taken.
✗ Branch 1086 not taken.
✗ Branch 1088 not taken.
✗ Branch 1089 not taken.
✗ Branch 1092 not taken.
✗ Branch 1093 not taken.
✗ Branch 1095 not taken.
✗ Branch 1096 not taken.
✗ Branch 1098 not taken.
✗ Branch 1099 not taken.
✗ Branch 1102 not taken.
✗ Branch 1103 not taken.
✗ Branch 1105 not taken.
✗ Branch 1106 not taken.
✗ Branch 1108 not taken.
✗ Branch 1109 not taken.
✗ Branch 1112 not taken.
✗ Branch 1113 not taken.
✗ Branch 1115 not taken.
✗ Branch 1116 not taken.
✗ Branch 1118 not taken.
✗ Branch 1119 not taken.
✗ Branch 1122 not taken.
✗ Branch 1123 not taken.
✗ Branch 1125 not taken.
✗ Branch 1126 not taken.
✗ Branch 1128 not taken.
✗ Branch 1129 not taken.
✗ Branch 1132 not taken.
✗ Branch 1133 not taken.
✗ Branch 1135 not taken.
✗ Branch 1136 not taken.
✗ Branch 1138 not taken.
✗ Branch 1139 not taken.
✗ Branch 1142 not taken.
✗ Branch 1143 not taken.
✗ Branch 1145 not taken.
✗ Branch 1146 not taken.
✗ Branch 1148 not taken.
✗ Branch 1149 not taken.
✗ Branch 1152 not taken.
✗ Branch 1153 not taken.
✗ Branch 1155 not taken.
✗ Branch 1156 not taken.
✗ Branch 1158 not taken.
✗ Branch 1159 not taken.
✗ Branch 1162 not taken.
✗ Branch 1163 not taken.
✗ Branch 1165 not taken.
✗ Branch 1166 not taken.
✗ Branch 1168 not taken.
✗ Branch 1169 not taken.
✗ Branch 1172 not taken.
✗ Branch 1173 not taken.
✗ Branch 1175 not taken.
✗ Branch 1176 not taken.
✗ Branch 1178 not taken.
✗ Branch 1179 not taken.
✗ Branch 1182 not taken.
✗ Branch 1183 not taken.
✗ Branch 1185 not taken.
✗ Branch 1186 not taken.
✗ Branch 1188 not taken.
✗ Branch 1189 not taken.
✗ Branch 1192 not taken.
✗ Branch 1193 not taken.
✗ Branch 1195 not taken.
✗ Branch 1196 not taken.
✗ Branch 1198 not taken.
✗ Branch 1199 not taken.
✗ Branch 1202 not taken.
✗ Branch 1203 not taken.
✗ Branch 1205 not taken.
✗ Branch 1206 not taken.
✗ Branch 1208 not taken.
✗ Branch 1209 not taken.
✗ Branch 1212 not taken.
✗ Branch 1213 not taken.
✗ Branch 1215 not taken.
✗ Branch 1216 not taken.
✗ Branch 1218 not taken.
✗ Branch 1219 not taken.
✗ Branch 1222 not taken.
✗ Branch 1223 not taken.
✗ Branch 1225 not taken.
✗ Branch 1226 not taken.
✗ Branch 1228 not taken.
✗ Branch 1229 not taken.
✗ Branch 1232 not taken.
✗ Branch 1233 not taken.
✗ Branch 1235 not taken.
✗ Branch 1236 not taken.
✗ Branch 1238 not taken.
✗ Branch 1239 not taken.
✗ Branch 1242 not taken.
✗ Branch 1243 not taken.
✗ Branch 1245 not taken.
✗ Branch 1246 not taken.
✗ Branch 1248 not taken.
✗ Branch 1249 not taken.
✗ Branch 1252 not taken.
✗ Branch 1253 not taken.
✗ Branch 1255 not taken.
✗ Branch 1256 not taken.
✗ Branch 1258 not taken.
✗ Branch 1259 not taken.
✗ Branch 1262 not taken.
✗ Branch 1263 not taken.
✗ Branch 1265 not taken.
✗ Branch 1266 not taken.
✗ Branch 1268 not taken.
✗ Branch 1269 not taken.
✗ Branch 1272 not taken.
✗ Branch 1273 not taken.
✗ Branch 1275 not taken.
✗ Branch 1276 not taken.
✗ Branch 1278 not taken.
✗ Branch 1279 not taken.
✗ Branch 1282 not taken.
✗ Branch 1283 not taken.
✗ Branch 1285 not taken.
✗ Branch 1286 not taken.
✗ Branch 1288 not taken.
✗ Branch 1289 not taken.
✗ Branch 1292 not taken.
✗ Branch 1293 not taken.
✗ Branch 1295 not taken.
✗ Branch 1296 not taken.
✗ Branch 1298 not taken.
✗ Branch 1299 not taken.
✗ Branch 1302 not taken.
✗ Branch 1303 not taken.
✗ Branch 1305 not taken.
✗ Branch 1306 not taken.
✗ Branch 1308 not taken.
✗ Branch 1309 not taken.
✗ Branch 1312 not taken.
✗ Branch 1313 not taken.
✗ Branch 1315 not taken.
✗ Branch 1316 not taken.
✗ Branch 1318 not taken.
✗ Branch 1319 not taken.
✗ Branch 1322 not taken.
✗ Branch 1323 not taken.
✗ Branch 1325 not taken.
✗ Branch 1326 not taken.
✗ Branch 1328 not taken.
✗ Branch 1329 not taken.
✗ Branch 1332 not taken.
✗ Branch 1333 not taken.
✗ Branch 1335 not taken.
✗ Branch 1336 not taken.
✗ Branch 1338 not taken.
✗ Branch 1339 not taken.
✗ Branch 1342 not taken.
✗ Branch 1343 not taken.
✗ Branch 1345 not taken.
✗ Branch 1346 not taken.
✗ Branch 1348 not taken.
✗ Branch 1349 not taken.
✗ Branch 1352 not taken.
✗ Branch 1353 not taken.
✗ Branch 1355 not taken.
✗ Branch 1356 not taken.
✗ Branch 1358 not taken.
✗ Branch 1359 not taken.
✗ Branch 1362 not taken.
✗ Branch 1363 not taken.
✗ Branch 1365 not taken.
✗ Branch 1366 not taken.
✗ Branch 1368 not taken.
✗ Branch 1369 not taken.
✗ Branch 1372 not taken.
✗ Branch 1373 not taken.
✗ Branch 1375 not taken.
✗ Branch 1376 not taken.
✗ Branch 1378 not taken.
✗ Branch 1379 not taken.
✗ Branch 1382 not taken.
✗ Branch 1383 not taken.
✗ Branch 1385 not taken.
✗ Branch 1386 not taken.
✗ Branch 1388 not taken.
✗ Branch 1389 not taken.
✗ Branch 1392 not taken.
✗ Branch 1393 not taken.
✗ Branch 1395 not taken.
✗ Branch 1396 not taken.
✗ Branch 1398 not taken.
✗ Branch 1399 not taken.
✗ Branch 1402 not taken.
✗ Branch 1403 not taken.
✗ Branch 1405 not taken.
✗ Branch 1406 not taken.
✗ Branch 1408 not taken.
✗ Branch 1409 not taken.
✗ Branch 1412 not taken.
✗ Branch 1413 not taken.
✗ Branch 1415 not taken.
✗ Branch 1416 not taken.
✗ Branch 1418 not taken.
✗ Branch 1419 not taken.
✗ Branch 1422 not taken.
✗ Branch 1423 not taken.
✗ Branch 1425 not taken.
✗ Branch 1426 not taken.
✗ Branch 1428 not taken.
✗ Branch 1429 not taken.
✗ Branch 1432 not taken.
✗ Branch 1433 not taken.
✗ Branch 1435 not taken.
✗ Branch 1436 not taken.
✗ Branch 1438 not taken.
✗ Branch 1439 not taken.
✗ Branch 1442 not taken.
✗ Branch 1443 not taken.
✗ Branch 1445 not taken.
✗ Branch 1446 not taken.
✗ Branch 1448 not taken.
✗ Branch 1449 not taken.
✗ Branch 1452 not taken.
✗ Branch 1453 not taken.
✗ Branch 1455 not taken.
✗ Branch 1456 not taken.
✗ Branch 1458 not taken.
✗ Branch 1459 not taken.
✗ Branch 1462 not taken.
✗ Branch 1463 not taken.
✗ Branch 1465 not taken.
✗ Branch 1466 not taken.
✗ Branch 1468 not taken.
✗ Branch 1469 not taken.
✗ Branch 1472 not taken.
✗ Branch 1473 not taken.
✗ Branch 1475 not taken.
✗ Branch 1476 not taken.
✗ Branch 1478 not taken.
✗ Branch 1479 not taken.
✗ Branch 1482 not taken.
✗ Branch 1483 not taken.
✗ Branch 1485 not taken.
✗ Branch 1486 not taken.
✗ Branch 1488 not taken.
✗ Branch 1489 not taken.
✗ Branch 1492 not taken.
✗ Branch 1493 not taken.
✗ Branch 1495 not taken.
✗ Branch 1496 not taken.
✗ Branch 1498 not taken.
✗ Branch 1499 not taken.
✗ Branch 1502 not taken.
✗ Branch 1503 not taken.
✗ Branch 1505 not taken.
✗ Branch 1506 not taken.
✗ Branch 1508 not taken.
✗ Branch 1509 not taken.
✗ Branch 1512 not taken.
✗ Branch 1513 not taken.
✗ Branch 1515 not taken.
✗ Branch 1516 not taken.
✗ Branch 1518 not taken.
✗ Branch 1519 not taken.
✗ Branch 1522 not taken.
✗ Branch 1523 not taken.
✗ Branch 1525 not taken.
✗ Branch 1526 not taken.
✗ Branch 1528 not taken.
✗ Branch 1529 not taken.
✗ Branch 1532 not taken.
✗ Branch 1533 not taken.
✗ Branch 1535 not taken.
✗ Branch 1536 not taken.
✗ Branch 1538 not taken.
✗ Branch 1539 not taken.
|
3616 | baseclass(size, val) { |
| 743 | } | ||
| 744 | |||
| 745 | /** | ||
| 746 | * \brief Gets the number of elements | ||
| 747 | * \return The actual number of elements in the vector | ||
| 748 | */ | ||
| 749 | index_t size() const { | ||
| 750 | // casts baseclass::size() from size_t (64 bits) | ||
| 751 | // to index_t (32 bits), because all | ||
| 752 | // indices in Vorpaline are supposed to fit in 32 bits (index_t). | ||
| 753 | // TODO: geo_debug_assert(baseclass::size() < max index_t) | ||
| 754 | return index_t(baseclass::size()); | ||
| 755 | } | ||
| 756 | |||
| 757 | /** | ||
| 758 | * \brief Gets a vector element | ||
| 759 | * \param[in] i index of the element | ||
| 760 | * \return A reference to the element at position \p i in the vector. | ||
| 761 | */ | ||
| 762 | T& operator[] (index_t i) { | ||
| 763 | geo_debug_assert(i < size()); | ||
| 764 | return baseclass::operator[] (i); | ||
| 765 | } | ||
| 766 | |||
| 767 | /** | ||
| 768 | * \brief Gets a vector element | ||
| 769 | * \param[in] i index of the element | ||
| 770 | * \return A const reference to the element at position | ||
| 771 | * \p i in the vector. | ||
| 772 | */ | ||
| 773 | const T& operator[] (index_t i) const { | ||
| 774 | geo_debug_assert(i < size()); | ||
| 775 | return baseclass::operator[] (i); | ||
| 776 | } | ||
| 777 | |||
| 778 | /** | ||
| 779 | * \brief Gets a vector element | ||
| 780 | * \param[in] i index of the element | ||
| 781 | * \return A reference to the element at position \p i in the vector. | ||
| 782 | */ | ||
| 783 | T& operator[] (signed_index_t i) { | ||
| 784 | geo_debug_assert(i >= 0 && index_t(i) < size()); | ||
| 785 |
8/182✓ Branch 0 taken 978178 times.
✓ Branch 1 taken 158427 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 149907 times.
✓ Branch 29 taken 271789 times.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✓ Branch 48 taken 735636 times.
✓ Branch 49 taken 2335122 times.
✗ Branch 50 not taken.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 63 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 66 not taken.
✗ Branch 67 not taken.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✗ Branch 72 not taken.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✗ Branch 77 not taken.
✗ Branch 78 not taken.
✗ Branch 79 not taken.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✗ Branch 82 not taken.
✗ Branch 83 not taken.
✗ Branch 84 not taken.
✗ Branch 85 not taken.
✗ Branch 86 not taken.
✗ Branch 87 not taken.
✗ Branch 88 not taken.
✗ Branch 89 not taken.
✗ Branch 90 not taken.
✗ Branch 91 not taken.
✗ Branch 92 not taken.
✗ Branch 93 not taken.
✗ Branch 94 not taken.
✗ Branch 95 not taken.
✗ Branch 96 not taken.
✗ Branch 97 not taken.
✗ Branch 98 not taken.
✗ Branch 99 not taken.
✓ Branch 100 taken 1969156 times.
✓ Branch 101 taken 5152305 times.
✗ Branch 102 not taken.
✗ Branch 103 not taken.
✗ Branch 104 not taken.
✗ Branch 105 not taken.
✗ Branch 106 not taken.
✗ Branch 107 not taken.
✗ Branch 108 not taken.
✗ Branch 109 not taken.
✗ Branch 110 not taken.
✗ Branch 111 not taken.
✗ Branch 112 not taken.
✗ Branch 113 not taken.
✗ Branch 114 not taken.
✗ Branch 115 not taken.
✗ Branch 116 not taken.
✗ Branch 117 not taken.
✗ Branch 118 not taken.
✗ Branch 119 not taken.
✗ Branch 120 not taken.
✗ Branch 121 not taken.
✗ Branch 122 not taken.
✗ Branch 123 not taken.
✗ Branch 124 not taken.
✗ Branch 125 not taken.
✗ Branch 126 not taken.
✗ Branch 127 not taken.
✗ Branch 128 not taken.
✗ Branch 129 not taken.
✗ Branch 130 not taken.
✗ Branch 131 not taken.
✗ Branch 132 not taken.
✗ Branch 133 not taken.
✗ Branch 134 not taken.
✗ Branch 135 not taken.
✗ Branch 136 not taken.
✗ Branch 137 not taken.
✗ Branch 138 not taken.
✗ Branch 139 not taken.
✗ Branch 140 not taken.
✗ Branch 141 not taken.
✗ Branch 142 not taken.
✗ Branch 143 not taken.
✗ Branch 144 not taken.
✗ Branch 145 not taken.
✗ Branch 146 not taken.
✗ Branch 147 not taken.
✗ Branch 148 not taken.
✗ Branch 149 not taken.
✗ Branch 150 not taken.
✗ Branch 151 not taken.
✗ Branch 152 not taken.
✗ Branch 153 not taken.
✗ Branch 154 not taken.
✗ Branch 155 not taken.
✗ Branch 156 not taken.
✗ Branch 157 not taken.
✗ Branch 158 not taken.
✗ Branch 159 not taken.
✗ Branch 160 not taken.
✗ Branch 161 not taken.
✗ Branch 162 not taken.
✗ Branch 163 not taken.
✗ Branch 164 not taken.
✗ Branch 165 not taken.
✗ Branch 166 not taken.
✗ Branch 167 not taken.
✗ Branch 168 not taken.
✗ Branch 169 not taken.
✗ Branch 170 not taken.
✗ Branch 171 not taken.
✗ Branch 172 not taken.
✗ Branch 173 not taken.
✗ Branch 174 not taken.
✗ Branch 175 not taken.
✗ Branch 176 not taken.
✗ Branch 177 not taken.
✗ Branch 178 not taken.
✗ Branch 179 not taken.
✗ Branch 180 not taken.
✗ Branch 181 not taken.
|
11750520 | return baseclass::operator[] (index_t(i)); |
| 786 | } | ||
| 787 | |||
| 788 | /** | ||
| 789 | * \brief Gets a vector element | ||
| 790 | * \param[in] i index of the element | ||
| 791 | * \return A const reference to the element at position \p i | ||
| 792 | * in the vector. | ||
| 793 | */ | ||
| 794 | const T& operator[] (signed_index_t i) const { | ||
| 795 | geo_debug_assert(i >= 0 && index_t(i) < size()); | ||
| 796 |
4/4✓ Branch 0 taken 552 times.
✓ Branch 1 taken 1016 times.
✓ Branch 2 taken 931 times.
✓ Branch 3 taken 1113 times.
|
3612 | return baseclass::operator[] (index_t(i)); |
| 797 | } | ||
| 798 | |||
| 799 | |||
| 800 | #ifdef GARGANTUA // If compiled with 64 bits index_t | ||
| 801 | |||
| 802 | /** | ||
| 803 | * \brief Gets a vector element | ||
| 804 | * \param[in] i index of the element | ||
| 805 | * \return A reference to the element at position \p i in the vector. | ||
| 806 | */ | ||
| 807 | T& operator[] (int i) { | ||
| 808 | geo_debug_assert(i >= 0 && index_t(i) < size()); | ||
| 809 |
2/6✓ Branch 0 taken 963142 times.
✓ Branch 1 taken 15036 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
2042133 | return baseclass::operator[] (index_t(i)); |
| 810 | } | ||
| 811 | |||
| 812 | /** | ||
| 813 | * \brief Gets a vector element | ||
| 814 | * \param[in] i index of the element | ||
| 815 | * \return A const reference to the element at position \p i | ||
| 816 | * in the vector. | ||
| 817 | */ | ||
| 818 | const T& operator[] (int i) const { | ||
| 819 | geo_debug_assert(i >= 0 && index_t(i) < size()); | ||
| 820 |
2/2✓ Branch 0 taken 476 times.
✓ Branch 1 taken 7358990 times.
|
7359466 | return baseclass::operator[] (index_t(i)); |
| 821 | } | ||
| 822 | |||
| 823 | /** | ||
| 824 | * \brief Gets a vector element | ||
| 825 | * \param[in] i index of the element | ||
| 826 | * \return A reference to the element at position \p i in the vector. | ||
| 827 | */ | ||
| 828 | T& operator[] (unsigned int i) { | ||
| 829 | geo_debug_assert(index_t(i) < size()); | ||
| 830 | ✗ | return baseclass::operator[] (index_t(i)); | |
| 831 | } | ||
| 832 | |||
| 833 | /** | ||
| 834 | * \brief Gets a vector element | ||
| 835 | * \param[in] i index of the element | ||
| 836 | * \return A const reference to the element at position \p i | ||
| 837 | * in the vector. | ||
| 838 | */ | ||
| 839 | const T& operator[] (unsigned int i) const { | ||
| 840 | geo_debug_assert(index_t(i) < size()); | ||
| 841 | ✗ | return baseclass::operator[] (index_t(i)); | |
| 842 | } | ||
| 843 | #endif | ||
| 844 | |||
| 845 | /** | ||
| 846 | * \brief Gets a pointer to the array of elements | ||
| 847 | * \return a pointer to the first element of the vector | ||
| 848 | */ | ||
| 849 | T* data() { | ||
| 850 | T* result = baseclass::data(); | ||
| 851 | // Tell the compiler that the pointer is aligned, to enable AVX | ||
| 852 | // vectorization, can be useful when using vector<double> | ||
| 853 | // with blas-like operations. I hope the hint will propagate to | ||
| 854 | // the caller (not sure...) | ||
| 855 | geo_assume_aligned(result, allocator::ALIGNMENT); | ||
| 856 | return result; | ||
| 857 | } | ||
| 858 | |||
| 859 | /** | ||
| 860 | * \brief Gets a pointer to the array of elements | ||
| 861 | * \return a const pointer to the first element of the vector | ||
| 862 | */ | ||
| 863 | const T* data() const { | ||
| 864 | const T* result = baseclass::data(); | ||
| 865 | // Tell the compiler that the pointer is aligned, to enable AVX | ||
| 866 | // vectorization, can be useful when using vector<double> | ||
| 867 | // with blas-like operations. I hope the hint will propagate to | ||
| 868 | // the caller (not sure...) | ||
| 869 | geo_assume_aligned(result, allocator::ALIGNMENT); | ||
| 870 | return result; | ||
| 871 | } | ||
| 872 | |||
| 873 | |||
| 874 | /** | ||
| 875 | * \brief Resizes this vector to zero and deallocated | ||
| 876 | * all the memory. | ||
| 877 | * \details clear() does not deallocate. | ||
| 878 | */ | ||
| 879 | void clear_and_deallocate() { | ||
| 880 | vector<T> other; | ||
| 881 | this->swap(other); | ||
| 882 | } | ||
| 883 | }; | ||
| 884 | |||
| 885 | /** | ||
| 886 | * \brief Specialization of vector for elements of type bool | ||
| 887 | * \details This specialization uses std::vector<bool> directly without | ||
| 888 | * memory alignment. | ||
| 889 | * \see vector | ||
| 890 | */ | ||
| 891 | template <> | ||
| 892 |
10/308✓ Branch 0 taken 6 times.
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✓ Branch 48 taken 36 times.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 63 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 66 not taken.
✗ Branch 67 not taken.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✗ Branch 72 not taken.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✗ Branch 77 not taken.
✓ Branch 78 taken 160 times.
✗ Branch 79 not taken.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✗ Branch 82 not taken.
✗ Branch 83 not taken.
✓ Branch 84 taken 320 times.
✗ Branch 85 not taken.
✗ Branch 86 not taken.
✗ Branch 87 not taken.
✗ Branch 88 not taken.
✗ Branch 89 not taken.
✗ Branch 90 not taken.
✗ Branch 91 not taken.
✗ Branch 92 not taken.
✗ Branch 93 not taken.
✗ Branch 94 not taken.
✗ Branch 95 not taken.
✗ Branch 96 not taken.
✗ Branch 97 not taken.
✗ Branch 98 not taken.
✗ Branch 99 not taken.
✗ Branch 100 not taken.
✗ Branch 101 not taken.
✗ Branch 102 not taken.
✗ Branch 103 not taken.
✗ Branch 104 not taken.
✗ Branch 105 not taken.
✗ Branch 106 not taken.
✗ Branch 107 not taken.
✗ Branch 108 not taken.
✗ Branch 109 not taken.
✗ Branch 110 not taken.
✗ Branch 111 not taken.
✗ Branch 112 not taken.
✗ Branch 113 not taken.
✗ Branch 114 not taken.
✗ Branch 115 not taken.
✗ Branch 116 not taken.
✗ Branch 117 not taken.
✗ Branch 118 not taken.
✗ Branch 119 not taken.
✗ Branch 120 not taken.
✗ Branch 121 not taken.
✓ Branch 122 taken 160 times.
✗ Branch 123 not taken.
✗ Branch 124 not taken.
✗ Branch 125 not taken.
✗ Branch 126 not taken.
✗ Branch 127 not taken.
✗ Branch 128 not taken.
✗ Branch 129 not taken.
✗ Branch 130 not taken.
✗ Branch 131 not taken.
✗ Branch 132 not taken.
✗ Branch 133 not taken.
✗ Branch 134 not taken.
✗ Branch 135 not taken.
✗ Branch 136 not taken.
✗ Branch 137 not taken.
✗ Branch 138 not taken.
✗ Branch 139 not taken.
✗ Branch 140 not taken.
✗ Branch 141 not taken.
✗ Branch 142 not taken.
✗ Branch 143 not taken.
✗ Branch 144 not taken.
✗ Branch 145 not taken.
✗ Branch 146 not taken.
✗ Branch 147 not taken.
✗ Branch 148 not taken.
✗ Branch 149 not taken.
✗ Branch 150 not taken.
✗ Branch 151 not taken.
✗ Branch 152 not taken.
✗ Branch 153 not taken.
✗ Branch 154 not taken.
✗ Branch 155 not taken.
✗ Branch 156 not taken.
✗ Branch 157 not taken.
✗ Branch 158 not taken.
✗ Branch 159 not taken.
✗ Branch 160 not taken.
✗ Branch 161 not taken.
✗ Branch 162 not taken.
✗ Branch 163 not taken.
✗ Branch 164 not taken.
✗ Branch 165 not taken.
✓ Branch 166 taken 160 times.
✗ Branch 167 not taken.
✗ Branch 168 not taken.
✗ Branch 169 not taken.
✗ Branch 170 not taken.
✗ Branch 171 not taken.
✓ Branch 172 taken 640 times.
✗ Branch 173 not taken.
✗ Branch 174 not taken.
✗ Branch 175 not taken.
✗ Branch 176 not taken.
✗ Branch 177 not taken.
✗ Branch 178 not taken.
✗ Branch 179 not taken.
✗ Branch 180 not taken.
✗ Branch 181 not taken.
✗ Branch 182 not taken.
✗ Branch 183 not taken.
✗ Branch 184 not taken.
✗ Branch 185 not taken.
✗ Branch 186 not taken.
✗ Branch 187 not taken.
✗ Branch 188 not taken.
✗ Branch 189 not taken.
✗ Branch 190 not taken.
✗ Branch 191 not taken.
✗ Branch 192 not taken.
✗ Branch 193 not taken.
✗ Branch 194 not taken.
✗ Branch 195 not taken.
✗ Branch 196 not taken.
✗ Branch 197 not taken.
✗ Branch 198 not taken.
✗ Branch 199 not taken.
✗ Branch 200 not taken.
✗ Branch 201 not taken.
✗ Branch 202 not taken.
✗ Branch 203 not taken.
✗ Branch 204 not taken.
✗ Branch 205 not taken.
✗ Branch 206 not taken.
✗ Branch 207 not taken.
✗ Branch 208 not taken.
✗ Branch 209 not taken.
✓ Branch 210 taken 160 times.
✗ Branch 211 not taken.
✗ Branch 212 not taken.
✗ Branch 213 not taken.
✗ Branch 214 not taken.
✗ Branch 215 not taken.
✗ Branch 216 not taken.
✗ Branch 217 not taken.
✗ Branch 218 not taken.
✗ Branch 219 not taken.
✗ Branch 220 not taken.
✗ Branch 221 not taken.
✗ Branch 222 not taken.
✗ Branch 223 not taken.
✗ Branch 224 not taken.
✗ Branch 225 not taken.
✗ Branch 226 not taken.
✗ Branch 227 not taken.
✗ Branch 228 not taken.
✗ Branch 229 not taken.
✗ Branch 230 not taken.
✗ Branch 231 not taken.
✗ Branch 232 not taken.
✗ Branch 233 not taken.
✗ Branch 234 not taken.
✗ Branch 235 not taken.
✗ Branch 236 not taken.
✗ Branch 237 not taken.
✗ Branch 238 not taken.
✗ Branch 239 not taken.
✗ Branch 240 not taken.
✗ Branch 241 not taken.
✗ Branch 242 not taken.
✗ Branch 243 not taken.
✗ Branch 244 not taken.
✗ Branch 245 not taken.
✗ Branch 246 not taken.
✗ Branch 247 not taken.
✗ Branch 248 not taken.
✗ Branch 249 not taken.
✗ Branch 250 not taken.
✗ Branch 251 not taken.
✗ Branch 252 not taken.
✗ Branch 253 not taken.
✗ Branch 254 not taken.
✗ Branch 255 not taken.
✗ Branch 256 not taken.
✗ Branch 257 not taken.
✗ Branch 258 not taken.
✗ Branch 259 not taken.
✗ Branch 260 not taken.
✗ Branch 261 not taken.
✗ Branch 262 not taken.
✗ Branch 263 not taken.
✗ Branch 264 not taken.
✗ Branch 265 not taken.
✗ Branch 266 not taken.
✗ Branch 267 not taken.
✗ Branch 268 not taken.
✗ Branch 269 not taken.
✗ Branch 270 not taken.
✗ Branch 271 not taken.
✗ Branch 272 not taken.
✗ Branch 273 not taken.
✗ Branch 274 not taken.
✗ Branch 275 not taken.
✗ Branch 276 not taken.
✗ Branch 277 not taken.
✗ Branch 278 not taken.
✗ Branch 279 not taken.
✗ Branch 280 not taken.
✗ Branch 281 not taken.
✗ Branch 282 not taken.
✗ Branch 283 not taken.
✗ Branch 284 not taken.
✗ Branch 285 not taken.
✗ Branch 286 not taken.
✗ Branch 287 not taken.
✗ Branch 288 not taken.
✗ Branch 289 not taken.
✗ Branch 290 not taken.
✗ Branch 291 not taken.
✗ Branch 292 not taken.
✗ Branch 293 not taken.
✗ Branch 294 not taken.
✗ Branch 295 not taken.
✗ Branch 296 not taken.
✗ Branch 297 not taken.
✗ Branch 298 not taken.
✗ Branch 299 not taken.
✗ Branch 300 not taken.
✗ Branch 301 not taken.
✗ Branch 302 not taken.
✗ Branch 303 not taken.
✗ Branch 304 not taken.
✗ Branch 305 not taken.
✗ Branch 306 not taken.
✗ Branch 307 not taken.
|
1718 | class vector<bool> : public ::std::vector<bool> { |
| 893 | typedef ::std::vector<bool> baseclass; | ||
| 894 | |||
| 895 | public: | ||
| 896 | /** \copydoc vector::vector() */ | ||
| 897 | vector() : | ||
| 898 | baseclass() { | ||
| 899 | } | ||
| 900 | |||
| 901 | /** \copydoc vector::vector(index_t) */ | ||
| 902 | explicit vector(index_t size) : | ||
| 903 | ✗ | baseclass(size) { | |
| 904 | } | ||
| 905 | |||
| 906 | /** \copydoc vector::vector(index_t,const T&) */ | ||
| 907 | 1708 | explicit vector(index_t size, bool val) : | |
| 908 |
16/617✓ Branch 1 taken 15 times.
✓ Branch 2 taken 57 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 67 not taken.
✗ Branch 68 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
✗ Branch 76 not taken.
✗ Branch 77 not taken.
✗ Branch 79 not taken.
✗ Branch 80 not taken.
✗ Branch 82 not taken.
✗ Branch 83 not taken.
✗ Branch 85 not taken.
✗ Branch 86 not taken.
✗ Branch 88 not taken.
✗ Branch 89 not taken.
✗ Branch 91 not taken.
✗ Branch 92 not taken.
✗ Branch 94 not taken.
✗ Branch 95 not taken.
✗ Branch 97 not taken.
✗ Branch 98 not taken.
✗ Branch 100 not taken.
✗ Branch 101 not taken.
✗ Branch 103 not taken.
✗ Branch 104 not taken.
✗ Branch 106 not taken.
✗ Branch 107 not taken.
✗ Branch 109 not taken.
✗ Branch 110 not taken.
✗ Branch 112 not taken.
✗ Branch 113 not taken.
✗ Branch 115 not taken.
✗ Branch 116 not taken.
✗ Branch 118 not taken.
✗ Branch 119 not taken.
✗ Branch 121 not taken.
✗ Branch 122 not taken.
✗ Branch 124 not taken.
✗ Branch 125 not taken.
✗ Branch 127 not taken.
✗ Branch 128 not taken.
✗ Branch 130 not taken.
✗ Branch 131 not taken.
✗ Branch 133 not taken.
✗ Branch 134 not taken.
✗ Branch 136 not taken.
✗ Branch 137 not taken.
✗ Branch 139 not taken.
✗ Branch 140 not taken.
✗ Branch 142 not taken.
✗ Branch 143 not taken.
✓ Branch 145 taken 36 times.
✗ Branch 146 not taken.
✓ Branch 148 taken 36 times.
✗ Branch 149 not taken.
✗ Branch 151 not taken.
✗ Branch 152 not taken.
✗ Branch 154 not taken.
✗ Branch 155 not taken.
✗ Branch 157 not taken.
✗ Branch 158 not taken.
✗ Branch 160 not taken.
✗ Branch 161 not taken.
✗ Branch 163 not taken.
✗ Branch 164 not taken.
✗ Branch 166 not taken.
✗ Branch 167 not taken.
✗ Branch 169 not taken.
✗ Branch 170 not taken.
✗ Branch 172 not taken.
✗ Branch 173 not taken.
✗ Branch 175 not taken.
✗ Branch 176 not taken.
✗ Branch 178 not taken.
✗ Branch 179 not taken.
✗ Branch 181 not taken.
✗ Branch 182 not taken.
✗ Branch 184 not taken.
✗ Branch 185 not taken.
✗ Branch 187 not taken.
✗ Branch 188 not taken.
✗ Branch 190 not taken.
✗ Branch 191 not taken.
✗ Branch 193 not taken.
✗ Branch 194 not taken.
✗ Branch 196 not taken.
✗ Branch 197 not taken.
✗ Branch 199 not taken.
✗ Branch 200 not taken.
✗ Branch 202 not taken.
✗ Branch 203 not taken.
✗ Branch 205 not taken.
✗ Branch 206 not taken.
✗ Branch 208 not taken.
✗ Branch 209 not taken.
✗ Branch 211 not taken.
✗ Branch 212 not taken.
✗ Branch 214 not taken.
✗ Branch 215 not taken.
✗ Branch 217 not taken.
✗ Branch 218 not taken.
✗ Branch 220 not taken.
✗ Branch 221 not taken.
✗ Branch 223 not taken.
✗ Branch 224 not taken.
✗ Branch 226 not taken.
✗ Branch 227 not taken.
✗ Branch 229 not taken.
✗ Branch 230 not taken.
✗ Branch 232 not taken.
✗ Branch 233 not taken.
✓ Branch 235 taken 160 times.
✗ Branch 236 not taken.
✓ Branch 238 taken 160 times.
✗ Branch 239 not taken.
✗ Branch 241 not taken.
✗ Branch 242 not taken.
✗ Branch 244 not taken.
✗ Branch 245 not taken.
✗ Branch 247 not taken.
✗ Branch 248 not taken.
✗ Branch 250 not taken.
✗ Branch 251 not taken.
✓ Branch 253 taken 320 times.
✗ Branch 254 not taken.
✓ Branch 256 taken 320 times.
✗ Branch 257 not taken.
✗ Branch 259 not taken.
✗ Branch 260 not taken.
✗ Branch 262 not taken.
✗ Branch 263 not taken.
✗ Branch 265 not taken.
✗ Branch 266 not taken.
✗ Branch 268 not taken.
✗ Branch 269 not taken.
✗ Branch 271 not taken.
✗ Branch 272 not taken.
✗ Branch 274 not taken.
✗ Branch 275 not taken.
✗ Branch 277 not taken.
✗ Branch 278 not taken.
✗ Branch 280 not taken.
✗ Branch 281 not taken.
✗ Branch 283 not taken.
✗ Branch 284 not taken.
✗ Branch 286 not taken.
✗ Branch 287 not taken.
✗ Branch 289 not taken.
✗ Branch 290 not taken.
✗ Branch 292 not taken.
✗ Branch 293 not taken.
✗ Branch 295 not taken.
✗ Branch 296 not taken.
✗ Branch 298 not taken.
✗ Branch 299 not taken.
✗ Branch 301 not taken.
✗ Branch 302 not taken.
✗ Branch 304 not taken.
✗ Branch 305 not taken.
✗ Branch 307 not taken.
✗ Branch 308 not taken.
✗ Branch 310 not taken.
✗ Branch 311 not taken.
✗ Branch 313 not taken.
✗ Branch 314 not taken.
✗ Branch 316 not taken.
✗ Branch 317 not taken.
✗ Branch 319 not taken.
✗ Branch 320 not taken.
✗ Branch 322 not taken.
✗ Branch 323 not taken.
✗ Branch 325 not taken.
✗ Branch 326 not taken.
✗ Branch 328 not taken.
✗ Branch 329 not taken.
✗ Branch 331 not taken.
✗ Branch 332 not taken.
✗ Branch 334 not taken.
✗ Branch 335 not taken.
✗ Branch 337 not taken.
✗ Branch 338 not taken.
✗ Branch 340 not taken.
✗ Branch 341 not taken.
✗ Branch 343 not taken.
✗ Branch 344 not taken.
✗ Branch 346 not taken.
✗ Branch 347 not taken.
✗ Branch 349 not taken.
✗ Branch 350 not taken.
✗ Branch 352 not taken.
✗ Branch 353 not taken.
✗ Branch 355 not taken.
✗ Branch 356 not taken.
✗ Branch 358 not taken.
✗ Branch 359 not taken.
✗ Branch 361 not taken.
✗ Branch 362 not taken.
✗ Branch 364 not taken.
✗ Branch 365 not taken.
✓ Branch 367 taken 160 times.
✗ Branch 368 not taken.
✓ Branch 370 taken 160 times.
✗ Branch 371 not taken.
✗ Branch 373 not taken.
✗ Branch 374 not taken.
✗ Branch 376 not taken.
✗ Branch 377 not taken.
✗ Branch 379 not taken.
✗ Branch 380 not taken.
✗ Branch 382 not taken.
✗ Branch 383 not taken.
✗ Branch 385 not taken.
✗ Branch 386 not taken.
✗ Branch 388 not taken.
✗ Branch 389 not taken.
✗ Branch 391 not taken.
✗ Branch 392 not taken.
✗ Branch 394 not taken.
✗ Branch 395 not taken.
✗ Branch 397 not taken.
✗ Branch 398 not taken.
✗ Branch 400 not taken.
✗ Branch 401 not taken.
✗ Branch 403 not taken.
✗ Branch 404 not taken.
✗ Branch 406 not taken.
✗ Branch 407 not taken.
✗ Branch 409 not taken.
✗ Branch 410 not taken.
✗ Branch 412 not taken.
✗ Branch 413 not taken.
✗ Branch 415 not taken.
✗ Branch 416 not taken.
✗ Branch 418 not taken.
✗ Branch 419 not taken.
✗ Branch 421 not taken.
✗ Branch 422 not taken.
✗ Branch 424 not taken.
✗ Branch 425 not taken.
✗ Branch 427 not taken.
✗ Branch 428 not taken.
✗ Branch 430 not taken.
✗ Branch 431 not taken.
✗ Branch 433 not taken.
✗ Branch 434 not taken.
✗ Branch 436 not taken.
✗ Branch 437 not taken.
✗ Branch 439 not taken.
✗ Branch 440 not taken.
✗ Branch 442 not taken.
✗ Branch 443 not taken.
✗ Branch 445 not taken.
✗ Branch 446 not taken.
✗ Branch 448 not taken.
✗ Branch 449 not taken.
✗ Branch 451 not taken.
✗ Branch 452 not taken.
✗ Branch 454 not taken.
✗ Branch 455 not taken.
✗ Branch 457 not taken.
✗ Branch 458 not taken.
✗ Branch 460 not taken.
✗ Branch 461 not taken.
✗ Branch 463 not taken.
✗ Branch 464 not taken.
✗ Branch 466 not taken.
✗ Branch 467 not taken.
✗ Branch 469 not taken.
✗ Branch 470 not taken.
✗ Branch 472 not taken.
✗ Branch 473 not taken.
✗ Branch 475 not taken.
✗ Branch 476 not taken.
✗ Branch 478 not taken.
✗ Branch 479 not taken.
✗ Branch 481 not taken.
✗ Branch 482 not taken.
✗ Branch 484 not taken.
✗ Branch 485 not taken.
✗ Branch 487 not taken.
✗ Branch 488 not taken.
✗ Branch 490 not taken.
✗ Branch 491 not taken.
✗ Branch 493 not taken.
✗ Branch 494 not taken.
✗ Branch 496 not taken.
✗ Branch 497 not taken.
✓ Branch 499 taken 160 times.
✗ Branch 500 not taken.
✓ Branch 502 taken 160 times.
✗ Branch 503 not taken.
✗ Branch 505 not taken.
✗ Branch 506 not taken.
✗ Branch 508 not taken.
✗ Branch 509 not taken.
✗ Branch 511 not taken.
✗ Branch 512 not taken.
✗ Branch 514 not taken.
✗ Branch 515 not taken.
✓ Branch 517 taken 640 times.
✗ Branch 518 not taken.
✓ Branch 520 taken 640 times.
✗ Branch 521 not taken.
✗ Branch 523 not taken.
✗ Branch 524 not taken.
✗ Branch 526 not taken.
✗ Branch 527 not taken.
✗ Branch 529 not taken.
✗ Branch 530 not taken.
✗ Branch 532 not taken.
✗ Branch 533 not taken.
✗ Branch 535 not taken.
✗ Branch 536 not taken.
✗ Branch 538 not taken.
✗ Branch 539 not taken.
✗ Branch 541 not taken.
✗ Branch 542 not taken.
✗ Branch 544 not taken.
✗ Branch 545 not taken.
✗ Branch 547 not taken.
✗ Branch 548 not taken.
✗ Branch 550 not taken.
✗ Branch 551 not taken.
✗ Branch 553 not taken.
✗ Branch 554 not taken.
✗ Branch 556 not taken.
✗ Branch 557 not taken.
✗ Branch 559 not taken.
✗ Branch 560 not taken.
✗ Branch 562 not taken.
✗ Branch 563 not taken.
✗ Branch 565 not taken.
✗ Branch 566 not taken.
✗ Branch 568 not taken.
✗ Branch 569 not taken.
✗ Branch 571 not taken.
✗ Branch 572 not taken.
✗ Branch 574 not taken.
✗ Branch 575 not taken.
✗ Branch 577 not taken.
✗ Branch 578 not taken.
✗ Branch 580 not taken.
✗ Branch 581 not taken.
✗ Branch 583 not taken.
✗ Branch 584 not taken.
✗ Branch 586 not taken.
✗ Branch 587 not taken.
✗ Branch 589 not taken.
✗ Branch 590 not taken.
✗ Branch 592 not taken.
✗ Branch 593 not taken.
✗ Branch 595 not taken.
✗ Branch 596 not taken.
✗ Branch 598 not taken.
✗ Branch 599 not taken.
✗ Branch 601 not taken.
✗ Branch 602 not taken.
✗ Branch 604 not taken.
✗ Branch 605 not taken.
✗ Branch 607 not taken.
✗ Branch 608 not taken.
✗ Branch 610 not taken.
✗ Branch 611 not taken.
✗ Branch 613 not taken.
✗ Branch 614 not taken.
✗ Branch 616 not taken.
✗ Branch 617 not taken.
✗ Branch 619 not taken.
✗ Branch 620 not taken.
✗ Branch 622 not taken.
✗ Branch 623 not taken.
✗ Branch 625 not taken.
✗ Branch 626 not taken.
✗ Branch 628 not taken.
✗ Branch 629 not taken.
✓ Branch 631 taken 160 times.
✗ Branch 632 not taken.
✓ Branch 634 taken 160 times.
✗ Branch 635 not taken.
✗ Branch 637 not taken.
✗ Branch 638 not taken.
✗ Branch 640 not taken.
✗ Branch 641 not taken.
✗ Branch 643 not taken.
✗ Branch 644 not taken.
✗ Branch 646 not taken.
✗ Branch 647 not taken.
✗ Branch 649 not taken.
✗ Branch 650 not taken.
✗ Branch 652 not taken.
✗ Branch 653 not taken.
✗ Branch 655 not taken.
✗ Branch 656 not taken.
✗ Branch 658 not taken.
✗ Branch 659 not taken.
✗ Branch 661 not taken.
✗ Branch 662 not taken.
✗ Branch 664 not taken.
✗ Branch 665 not taken.
✗ Branch 667 not taken.
✗ Branch 668 not taken.
✗ Branch 670 not taken.
✗ Branch 671 not taken.
✗ Branch 673 not taken.
✗ Branch 674 not taken.
✗ Branch 676 not taken.
✗ Branch 677 not taken.
✗ Branch 679 not taken.
✗ Branch 680 not taken.
✗ Branch 682 not taken.
✗ Branch 683 not taken.
✗ Branch 685 not taken.
✗ Branch 686 not taken.
✗ Branch 688 not taken.
✗ Branch 689 not taken.
✗ Branch 691 not taken.
✗ Branch 692 not taken.
✗ Branch 694 not taken.
✗ Branch 695 not taken.
✗ Branch 697 not taken.
✗ Branch 698 not taken.
✗ Branch 700 not taken.
✗ Branch 701 not taken.
✗ Branch 703 not taken.
✗ Branch 704 not taken.
✗ Branch 706 not taken.
✗ Branch 707 not taken.
✗ Branch 709 not taken.
✗ Branch 710 not taken.
✗ Branch 712 not taken.
✗ Branch 713 not taken.
✗ Branch 715 not taken.
✗ Branch 716 not taken.
✗ Branch 718 not taken.
✗ Branch 719 not taken.
✗ Branch 721 not taken.
✗ Branch 722 not taken.
✗ Branch 724 not taken.
✗ Branch 725 not taken.
✗ Branch 727 not taken.
✗ Branch 728 not taken.
✗ Branch 730 not taken.
✗ Branch 731 not taken.
✗ Branch 733 not taken.
✗ Branch 734 not taken.
✗ Branch 736 not taken.
✗ Branch 737 not taken.
✗ Branch 739 not taken.
✗ Branch 740 not taken.
✗ Branch 742 not taken.
✗ Branch 743 not taken.
✗ Branch 745 not taken.
✗ Branch 746 not taken.
✗ Branch 748 not taken.
✗ Branch 749 not taken.
✗ Branch 751 not taken.
✗ Branch 752 not taken.
✗ Branch 754 not taken.
✗ Branch 755 not taken.
✗ Branch 757 not taken.
✗ Branch 758 not taken.
✗ Branch 760 not taken.
✗ Branch 761 not taken.
✗ Branch 763 not taken.
✗ Branch 764 not taken.
✗ Branch 766 not taken.
✗ Branch 767 not taken.
✗ Branch 769 not taken.
✗ Branch 770 not taken.
✗ Branch 772 not taken.
✗ Branch 773 not taken.
✗ Branch 775 not taken.
✗ Branch 776 not taken.
✗ Branch 778 not taken.
✗ Branch 779 not taken.
✗ Branch 781 not taken.
✗ Branch 782 not taken.
✗ Branch 784 not taken.
✗ Branch 785 not taken.
✗ Branch 787 not taken.
✗ Branch 788 not taken.
✗ Branch 790 not taken.
✗ Branch 791 not taken.
✗ Branch 793 not taken.
✗ Branch 794 not taken.
✗ Branch 796 not taken.
✗ Branch 797 not taken.
✗ Branch 799 not taken.
✗ Branch 800 not taken.
✗ Branch 802 not taken.
✗ Branch 803 not taken.
✗ Branch 805 not taken.
✗ Branch 806 not taken.
✗ Branch 808 not taken.
✗ Branch 809 not taken.
✗ Branch 811 not taken.
✗ Branch 812 not taken.
✗ Branch 814 not taken.
✗ Branch 815 not taken.
✗ Branch 817 not taken.
✗ Branch 818 not taken.
✗ Branch 820 not taken.
✗ Branch 821 not taken.
✗ Branch 823 not taken.
✗ Branch 824 not taken.
✗ Branch 826 not taken.
✗ Branch 827 not taken.
✗ Branch 829 not taken.
✗ Branch 830 not taken.
✗ Branch 832 not taken.
✗ Branch 833 not taken.
✗ Branch 835 not taken.
✗ Branch 836 not taken.
✗ Branch 838 not taken.
✗ Branch 839 not taken.
✗ Branch 841 not taken.
✗ Branch 842 not taken.
✗ Branch 844 not taken.
✗ Branch 845 not taken.
✗ Branch 847 not taken.
✗ Branch 848 not taken.
✗ Branch 850 not taken.
✗ Branch 851 not taken.
✗ Branch 853 not taken.
✗ Branch 854 not taken.
✗ Branch 856 not taken.
✗ Branch 857 not taken.
✗ Branch 859 not taken.
✗ Branch 860 not taken.
✗ Branch 862 not taken.
✗ Branch 863 not taken.
✗ Branch 865 not taken.
✗ Branch 866 not taken.
✗ Branch 868 not taken.
✗ Branch 869 not taken.
✗ Branch 871 not taken.
✗ Branch 872 not taken.
✗ Branch 874 not taken.
✗ Branch 875 not taken.
✗ Branch 877 not taken.
✗ Branch 878 not taken.
✗ Branch 880 not taken.
✗ Branch 881 not taken.
✗ Branch 883 not taken.
✗ Branch 884 not taken.
✗ Branch 886 not taken.
✗ Branch 887 not taken.
✗ Branch 889 not taken.
✗ Branch 890 not taken.
✗ Branch 892 not taken.
✗ Branch 893 not taken.
✗ Branch 895 not taken.
✗ Branch 896 not taken.
✗ Branch 898 not taken.
✗ Branch 899 not taken.
✗ Branch 901 not taken.
✗ Branch 902 not taken.
✗ Branch 904 not taken.
✗ Branch 905 not taken.
✗ Branch 907 not taken.
✗ Branch 908 not taken.
✗ Branch 910 not taken.
✗ Branch 911 not taken.
✗ Branch 913 not taken.
✗ Branch 914 not taken.
✗ Branch 916 not taken.
✗ Branch 917 not taken.
✗ Branch 919 not taken.
✗ Branch 920 not taken.
✗ Branch 922 not taken.
✗ Branch 923 not taken.
|
1708 | baseclass(size, val) { |
| 909 | } | ||
| 910 | |||
| 911 | /** \copydoc vector::size() */ | ||
| 912 | index_t size() const { | ||
| 913 | // casts baseclass::size() from size_t (64 bits) | ||
| 914 | // to index_t (32 bits), because all | ||
| 915 | // indices in Vorpaline are supposed to fit in 32 bits (index_t). | ||
| 916 | // TODO: geo_debug_assert(baseclass::size() < max index_t) | ||
| 917 | return index_t(baseclass::size()); | ||
| 918 | } | ||
| 919 | |||
| 920 | // TODO: operator[] with bounds checking (more complicated | ||
| 921 | // than just returning bool&, check implementation in STL). | ||
| 922 | }; | ||
| 923 | } | ||
| 924 | |||
| 925 | #endif | ||
| 926 |